/**
  * 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&ouml;ytynyt!");
     }
     return $palaute;
 }