/** * Tallentaa arvot tietokantaan eli muuttaa jo olemassaolevaa tietokantariviä. * Se, onko arvoja muutettu, tarkistetaan ensin, eikä tallennukseen mennä, * ellei vähintään yhtä arvoa ole muutettu (id:tä ei lasketa). Samalla * tarkistetaan myös, että olio ylipäätään on tietokannassa. * * <p>Virhetilanteessa lähetetään ilmoituksiin kuvaus, joka on suoraan * näytettävissä käyttäjälle.</p> * * Palauttaa joko arvon Malliluokkapohja2::$OPERAATIO_ONNISTUI tai * Malliluokkapohja2::$VIRHE. * * @return type */ public function tallenna_muutokset() { $palaute = Malliluokkapohja2::$VIRHE; $max_muutosrivilkm = 1; // Luodaan uusi, koska id:llä voi periaatteessa olla muutettu arvo! $tietokantasoluehto = new Tietokantasolu(Malliluokkapohja2::$SARAKENIMI_ID, true); // Otetaan varmasti oikea id mukaan: $tietokantasoluehto->set_arvo_kevyt($this->id_tietokanta); if ($tietokantasoluehto instanceof Tietokantasolu) { // Haetaan vertailuolio (Tietokantarivi) tietokannasta, johon // tämän olion tietokantarivin arvoja voidaan // verrata ja muutokset huomata. Huomaa, että seuraava toimii vain, // ellei alkuperäinen id ole muuttunut! Siksi erillinen muuttuja // "id_tietokanta", jota ei voi muuttaa! $on_muutoksia = false; $alkup_tietokantarivi = $this->hae_tietokantarivi_tietokannasta($this->id_tietokanta); // Ellei tietoja löydy tai niitä ei ole muokattu (id:tä ei lasketa), // tai jos muokattu on ei-määritelty, // ei yritetä tallentaa, vaan heitetään virheilmoitus. if ($alkup_tietokantarivi instanceof Tietokantarivi) { foreach ($alkup_tietokantarivi->get_tietokantasolut() as $solu) { if ($solu instanceof Tietokantasolu && $solu->get_sarakenimi() != Malliluokkapohja2::$SARAKENIMI_ID) { // Haetaan tietokantasolu, jota on voitu muokata: $mahd_muokattu_solu = $this->get_tietokantasolu($solu->get_sarakenimi()); // Jos havaitaan määritelty muokkaus, palautetaan true. if ($mahd_muokattu_solu->get_arvo() != Malliluokkapohja2::$MUUTTUJAA_EI_MAARITELTY && $solu->get_arvo() != $mahd_muokattu_solu->get_arvo()) { $on_muutoksia = true; break; } } } if ($on_muutoksia) { $tallennuspalaute = $this->tietokantaolio->UPDATE($this->tietokantarivi, $tietokantasoluehto, $max_muutosrivilkm); // Jos onnistui: if ($tallennuspalaute === Tietokantaolio::$HAKU_ONNISTUI) { $palaute = Malliluokkapohja2::$OPERAATIO_ONNISTUI; // Tämä on tärkeä, jotta olio vastaa todellisuutta: $this->paivita_olion_tiedot_tietokannasta(); } else { $this->lisaa_virheilmoitus("Virhe tietokantaolio->UPDATE-metodissa"); } } else { // Käyttäjälle asti tuleva ilmoitus -> käännösmahdollisuus: $this->lisaa_virheilmoitus(Perustustekstit::$ilm_tiedoissa_ei_muutoksia); // Varmuuden vuoksi palautetaan id:n arvo oikeaksi, // jos joku törppö on yrittänyt muuttaa (muut arvot ovat // vanhoja): $this->set_id($this->get_id_tietokanta()); } } else { $this->lisaa_virheilmoitus(Perustustekstit::$ilm_tietoja_ei_tietokannassa); } } else { $this->lisaa_virheilmoitus("Virhe muokkaustallennuksessa: " . "id-tietokantasolua ei löytynyt!"); } return $palaute; }