/** * DEPRECATED! * @param <type> $taulu tietokantataulun nimi * @param <type> $sarakenimitaulukko Taulukko, joka sisältää sarakenimet. * @param <type> $arvotaulukko Taulukko, joka sisältää vastaavat arvot. * HUOM! Taulukoissa pitää olla yhtä monta alkiota, muuten tulee palautetta! * Muutenkin käyttäjän pitää huolehtia, että sarakenimet vastaavat * olemassaolevaa tietokantataulua, ja että arvot ovat samassa järjestyksessä. * * Lisäksi oletetaan, että taulukon pääindeksi tuotetaan automaattisesti * (auto-increment), ellei sitä anneta erikseen. * * @param string $virheilmoitus mysql_query-lauseen palauttaessa falsen. * @return string Palauttaa arvon Tietokantaolio::$HAKU_ONNISTUI, * jos tallennus ok, muuten false. * function tallenna_uusi_rivi($taulu, $sarakenimitaulukko, $arvotaulukko, $virheilmoitus) { $onnistu = false; $sarakeLkm = sizeof($sarakenimitaulukko); $arvoLkm = sizeof($arvotaulukko); if(!isset($sarakenimitaulukko) || !isset($arvotaulukko) || ($sarakeLkm != $arvoLkm) || ($sarakeLkm == 0)) { // Virheilmoitus kehittäjälle (ei käyttäjälle yl. näy): $onnistu = "Virhe tallennuksessa: Sarakenimi- ja arvotaulukot". " eivät täsmää, ole määriteltyjä tai ovat tyhjiä"; } else { $saraketeksti = ''; $arvoteksti = ''; for($i = 0; $i < $sarakeLkm; $i++) { /* Ajatus: arvojen int-vertailu, jolloin lukujen kohdalla * turhat ja hidastavat hipsut '' voidaan välttää. * Form-input on kuulemma aina string. Olennaista? * if($i == 0) // Pilkkujen viilausta: { $saraketeksti = $sarakenimitaulukko[$i]; $arvoteksti = "'".$arvotaulukko[$i]."'"; } else { $saraketeksti .= ", ".$sarakenimitaulukko[$i]; $arvoteksti .= ", '".$arvotaulukko[$i]."'"; } } // MYSQL: if($this->dbtyyppi == 'mysql') { $kyselylause = "INSERT INTO $taulu ($saraketeksti) VALUE ($arvoteksti)"; $kyselyn_tila = mysql_query($kyselylause); if($kyselyn_tila == false){ $onnistu = $virheilmoitus. " (Tietokantaolio.tallenna_uusi_rivi)"; } else if(mysql_affected_rows() == 1) { $onnistu = Tietokantaolio::$HAKU_ONNISTUI; } } } return $onnistu; } /** * Tallentaa Mallipohjaluokasta perityn olion tietokantaan. Tämä on nykyään * ensisijainen tapa tallentaa tietokantaan. * * @param Tietokantarivi $tietokantarivi Tietokantarivi-luokan olio * @return string Palauttaa arvon Tietokantaolio::$HAKU_ONNISTUI, * jos tallennus ok, muuten arvon * Tietokantaolio::$HAKUVIRHE+tietokantakyselyn (tarkoitettu vain testikäyttöön). * @author JP (9.5.2013) */ public function tallenna_rivi($tietokantarivi) { $onnistu = Tietokantaolio::$HAKUVIRHE; if ($tietokantarivi instanceof Tietokantarivi) { $taulu = $tietokantarivi->get_taulunimi(); if ($this->dbtyyppi == 'mysql') { $laskuri = 0; $tietokantasolut = $tietokantarivi->get_tietokantasolut(); $sarakenimet = "("; $arvot = "("; // Id-saraketta ei oteta mukaan, koska se on aina automaattinen: foreach ($tietokantasolut as $solu) { if ($solu instanceof Tietokantasolu && $solu->tiedot_ok() && $solu->get_sarakenimi() != Malliluokkapohja::$SARAKENIMI_ID) { // Pilkut kohdalleen if-lauseen avulla. if ($laskuri > 0) { $arvot .= ","; $sarakenimet .= ","; } $sarakenimet .= $solu->get_sarakenimi(); // Arvoissa laitetaan hipsut vain ei-lukuihin (liekö // merkitystä?) if ($solu->get_arvon_tyyppi() == Tietokantasolu::$luku_int) { $arvot .= $solu->get_arvo(); } else { $arvot .= "'" . $solu->get_arvo() . "'"; } $laskuri++; } } // Sulut kiinni: $sarakenimet .= ")"; $arvot .= ")"; $insert_koodi = "INSERT INTO " . $taulu . " "; $value_koodi = " VALUE "; $kyselylause = $insert_koodi . $sarakenimet . $value_koodi . $arvot; $kyselyn_tila = mysql_query($kyselylause); if ($kyselyn_tila && mysql_affected_rows() == 1) { $onnistu = Tietokantaolio::$HAKU_ONNISTUI; } else { $onnistu = Tietokantaolio::$HAKUVIRHE . "<br/>" . $kyselylause; } } } return $onnistu; }
/** * 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ä. * * <p> * Palauttaa joko arvon Tietokantaolio::$HAKU_ONNISTUI tai * Tietokantaolio::$HAKUVIRHE toiminnon onnistumisen mukaan. * </p> * * @param Tietokantarivi $tietokantarivi * @param Tietokantasolu $tietokantasoluehto * @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($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 solut paitsi id-sarake: foreach ($tietokantasolut as $solu) { if ($solu instanceof Tietokantasolu && $solu->tiedot_ok() && $solu->get_sarakenimi() != Malliluokkapohja2::$SARAKENIMI_ID) { // Pilkut kohdalleen if-lauseen avulla. if ($laskuri == 0) { if ($solu->get_arvo_on_luku()) { $set_koodi .= $solu->get_sarakenimi() . "=" . $solu->get_arvo(); } else { $set_koodi .= $solu->get_sarakenimi() . "='" . $solu->get_arvo() . "'"; } } else { if ($solu->get_arvo_on_luku()) { $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; } } } return $tulos; }