示例#1
0
 /**
  * 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.
  * 
  * Virhetilanteessa lähetetään ilmoituksiin kuvaus, joka on suoraan
  * näytettävissä käyttäjälle.
  * 
  * Palauttaa onnistumisen
  * mukaan joko ::$OPERAATIO_ONNISTUI tai ::$VIRHE. Viimeksi
  * mainitussa tapauksessa kannattaa tarkistaa tarkemmat kommentit olion
  * virheilmoituksista.
  * 
  * @return type 
  */
 public function tallenna_muutokset()
 {
     $palaute = Malliluokkapohja::$VIRHE;
     $max_muutosrivilkm = 1;
     // Luodaan uusi, koska id:llä voi periaatteessa olla muutettu arvo!
     $tietokantasoluehto = new Tietokantasolu(Malliluokkapohja::$SARAKENIMI_ID, Tietokantasolu::$mj_tyhja_EI_ok);
     // 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);
         $arvot_kunnossa = true;
         // Vain true päästää tallentamaan.
         // 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() != Malliluokkapohja::$SARAKENIMI_ID) {
                     // Haetaan tietokantasolu, jota on voitu muokata:
                     $mahd_muokattu_solu = $this->get_tietokantasolu($solu->get_sarakenimi());
                     // Jos havaitaan kunnollinen muokkaus, palautetaan true.
                     if ($mahd_muokattu_solu->tiedot_ok() && $solu->get_arvo() != $mahd_muokattu_solu->get_arvo()) {
                         $on_muutoksia = true;
                         $mahd_muokattu_solu->set_on_muokattu(true);
                     } else {
                         if (!$mahd_muokattu_solu->tiedot_ok()) {
                             // Arvo saa olla määrittelemätön, muttei väärä!
                             if ($mahd_muokattu_solu->get_arvo() == Pohja::$ARVO_VAARANTYYPPINEN) {
                                 $arvot_kunnossa = false;
                                 $this->lisaa_virheilmoitus($mahd_muokattu_solu->get_sarakenimi() . Perustustekstit::$muuttujan_arvo_vaarantyyppinen);
                                 // Tyhjä silloin kun ei sallittu:
                             } else {
                                 if ($mahd_muokattu_solu->get_arvo() == Pohja::$ARVO_TYHJA) {
                                     $arvot_kunnossa = false;
                                     $this->lisaa_virheilmoitus($mahd_muokattu_solu->get_sarakenimi() . Perustustekstit::$muuttujan_arvo_tyhja);
                                 }
                             }
                         } else {
                             // Arvoa ei muutettu, eli ei tarvitse sitä tallentaa.
                             $mahd_muokattu_solu->set_on_muokattu(false);
                         }
                     }
                 }
             }
             if ($on_muutoksia && $arvot_kunnossa) {
                 $tallennuspalaute = $this->tietokantaolio->update_rivi($this->tietokantarivi, $tietokantasoluehto, $max_muutosrivilkm);
                 // Jos onnistui:
                 if ($tallennuspalaute === Tietokantaolio::$HAKU_ONNISTUI) {
                     $palaute = Malliluokkapohja::$OPERAATIO_ONNISTUI;
                     // Tämä on tärkeä, jotta olio vastaa todellisuutta:
                     $this->paivita_olion_tiedot_tietokannasta();
                     //========= testausta ==================================
                     $this->lisaa_kommentti($this->tietokantaolio->tulosta_kaikki_ilmoitukset());
                     //========= testausta ==================================
                 } else {
                     $this->lisaa_virheilmoitus(Perustustekstit::$malliluokkapohja_virheilm_muutostallennuksen_tietokantavirhe . " " . $this->tietokantarivi->toString());
                     //echo $this->tietokantaolio->tulosta_virheilmoitukset();
                 }
             } else {
                 if (!$arvot_kunnossa) {
                     $this->lisaa_virheilmoitus(Perustustekstit::$Tietoja_ei_tallennettu);
                 } 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;
 }
示例#2
0
 /**
  * Tämä metodi suorittaa haun, jossa muutetaan olemassaolevan
  * tietokantataulun tietoja (paitsi id:tä ei muuteta koskaan). 
  * Parametrina annetaan muutostiedot
  * Tietokantarivi-luokan oliona, ehtotiedot
  * Tietokantasolu-luokan oliona sekä muutettavien rivien maksimilukumäärä.
  *
  * HUOM! Tietokantasoluehto pitää olla uusi olio [new Tietokantasolu].
  * Valmiin solun haku muutettavasta oliosta voi aiheuttaa hankalasti
  * huomattavia yllätyksiä, jos ehto ja muutos viittaavat samaan 
  * tietokantasarakkeeseen!!
  * 
  * <p>
  * Palauttaa joko arvon Tietokantaolio::$HAKU_ONNISTUI tai 
  * Tietokantaolio::$HAKUVIRHE toiminnon onnistumisen mukaan.
  * </p>
  * 
  * 
  * @param Tietokantarivi $tietokantarivi tallennettavat tiedot. Huomaa, että
  * vain määritellyt ja muutetut tiedot tallennetaan. 
  * @param Tietokantasolu $tietokantasoluehto mihin tallennetaan
  * @param int $max_muutosrivilkm Huom! Arvo Tietokantaolio::$EI_RAJOITETTU
  * antaa mahdollisuuden muuttaa mielivaltaisen määrän rivejä.
  * @return type 
  * @author Jukka-Pekka Kerkkänen 22.10.2012
  */
 public function update_rivi($tietokantarivi, $tietokantasoluehto, $max_muutosrivilkm)
 {
     $tulos = Tietokantaolio::$HAKUVIRHE;
     if ($tietokantarivi instanceof Tietokantarivi && $tietokantasoluehto instanceof Tietokantasolu && $tietokantasoluehto->tiedot_ok()) {
         $taulu = $tietokantarivi->get_taulunimi();
         $ehtosarake = $tietokantasoluehto->get_sarakenimi();
         $ehtoarvo = $tietokantasoluehto->get_arvo();
         if ($this->dbtyyppi == 'mysql') {
             $laskuri = 0;
             $set_koodi = "SET ";
             $tietokantasolut = $tietokantarivi->get_tietokantasolut();
             // Tallennetaan kaikki määritellyt ja muutetut solut paitsi id-sarake:
             foreach ($tietokantasolut as $solu) {
                 if ($solu instanceof Tietokantasolu && $solu->tiedot_ok() && $solu->on_muokattu() && $solu->get_sarakenimi() != Malliluokkapohja::$SARAKENIMI_ID) {
                     // Pilkut kohdalleen if-lauseen avulla.
                     if ($laskuri > 0) {
                         $set_koodi .= ",";
                     }
                     if ($solu->get_arvon_tyyppi() === Tietokantasolu::$luku_int) {
                         $set_koodi .= $solu->get_sarakenimi() . "=" . $solu->get_arvo();
                     } else {
                         $set_koodi .= $solu->get_sarakenimi() . "='" . $solu->get_arvo() . "'";
                     }
                     $laskuri++;
                 }
             }
             if ($max_muutosrivilkm === Tietokantaolio::$EI_RAJOITETTU) {
                 $hakulause = "UPDATE {$taulu}\n                                {$set_koodi}\n                                WHERE {$ehtosarake}='{$ehtoarvo}'";
             } else {
                 $hakulause = "UPDATE {$taulu}\n                                {$set_koodi}\n                                WHERE {$ehtosarake}='{$ehtoarvo}'\n                                LIMIT {$max_muutosrivilkm}";
             }
             $tulos = mysql_query($hakulause);
             //FALSE on failure, true muutoin.
             if ($tulos) {
                 $tulos = Tietokantaolio::$HAKU_ONNISTUI;
                 //$this->lisaa_kommentti("<br/>".$hakulause."<br/>");
             } else {
                 //$this->lisaa_virheilmoitus("<br/>".$hakulause."<br/>");
             }
         }
     }
     return $tulos;
 }
 /**
  * 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;
 }