Andmete muutmine

Mitme seotud andmetabeli pealt kokku ehitatud veebihaldusliidese keerukaimaks kohaks on valitava tunnuse muutmine rippmenüü kaudu – et muutmisel oleks olemasolev valik ette keritud ning võimalik muutus ka õigesti kirja läheks.
Muus osas on muutmine suhteliselt sarnane konspekti algusosas oleva teadetetabeli andmete muutmisega. Vaid SQL-päringud on HTMLi koodist välja viidud ning andmeid näidatakse abifunktsioonid.php-failist tulnud muutujate kaudu.
Kaupade loetelu kuvamisel on kõigepealt iga kauba ees viide kustutamiseks või muutmiseks. Andmete kuvamisel vaadatakse, kas aadressiribalt on saabunud parameeter nimega muutmisid ning kas muudetava kauba id kattub parasjagu näidatava kauba id-ga.

 <?php if(isSet($_REQUEST["muutmisid"]) &&  
intval($_REQUEST["muutmisid"])==$kaup->id): ?> 

Kui jah, siis kuvatakse rida tavalisega võrreldes erinevalt, sätitakse andmed sellisele kujule, et neid veebilehelt muuta saab. Nimetus ja hind tulevad nähtavale tekstivälja paigutatult. Kaubagrupp aga paigutatakse sellisesse rippmenüüsse, kus sobiv valik on juba ette keeratud. Selleks tuleb vastavat abifunktsiooni mõnevõrra täiendada, millest edaspidi allpool.

 <table> 
 <tr> 
 <th>Haldus</th> 
 <th>Nimetus</th> 
 <th>Kaubagrupp</th> 
 <th>Hind</th> 
 </tr> 
 <?php foreach($kaubad as $kaup): ?> 
 <tr> 
 <?php if(isSet($_REQUEST["muutmisid"]) && 
 intval($_REQUEST["muutmisid"])==$kaup->id): ?>  <td> 
 <input type="submit" name="muutmine" value="Muuda" /> 
 <input type="submit" name="katkestus" value="Katkesta" />  <input type="hidden" name="muudetudid" value="<?=$kaup->id ?>" />  </td> 
 <td><input type="text" name="nimetus" value="<?=$kaup->nimetus ?>" /></td>  <td><?php 
 echo looRippMenyy("SELECT id, grupinimi FROM kaubagrupid",  "kaubagrupi_id", $kaup->kaubagrupi_id);  ?></td> 
 <td><input type="text" name="hind" value="<?=$kaup->hind ?>" /></td>  <?php else: ?>  
 <td><a href="kaubahaldus.php?kustutusid=<?=$kaup->id ?>"  onclick="return confirm('Kas ikka soovid kustutada?')">x</a>  <a href="kaubahaldus.php?muutmisid=<?=$kaup->id ?>">m</a>  </td> 
 <td><?=$kaup->nimetus ?></td> 
 <td><?=$kaup->grupinimi ?></td> 
 <td><?=$kaup->hind ?></td> 
 <?php endif ?> 
 </tr> 
 <?php endforeach; ?> 
 </table> 

Kauba andmete näitamise loetellu tuleb parameetriks juurde kaubagrupi_id, et oleks võimalik selle abil muutmise ajal rippmenüüst sobivat valikut näidata.

 function kysiKaupadeAndmed($sorttulp="nimetus", $otsisona=""){ 
 global $yhendus; 
 $lubatudtulbad=array("nimetus", "grupinimi", "hind"); 
 if(!in_array($sorttulp, $lubatudtulbad)){ 
 return "lubamatu tulp"; 
 } 
 $otsisona=addslashes(stripslashes($otsisona)); 
 $kask=$yhendus->prepare("SELECT kaubad.id, nimetus, grupinimi, kaubagrupi_id, hind  FROM kaubad, kaubagrupid 
 WHERE kaubad.kaubagrupi_id=kaubagrupid.id 
 AND (nimetus LIKE '%$otsisona%' OR grupinimi LIKE '%$otsisona%')  ORDER BY $sorttulp"); 
 $kask->bind_result($id, $nimetus, $grupinimi, $kaubagrupi_id, $hind);  $kask->execute(); 
 $hoidla=array(); 
 while($kask->fetch()){ 
 $kaup=new stdClass(); 
 $kaup->id=$id; 
 $kaup->nimetus=htmlspecialchars($nimetus); 
 $kaup->grupinimi=htmlspecialchars($grupinimi); 
 $kaup->kaubagrupi_id=$kaubagrupi_id; 
 $kaup->hind=$hind; 
 array_push($hoidla, $kaup); 
 } 
 return $hoidla; 
 } 

Rippmenüüle tuleb juurde täiendav parameeter nimega $valitudid. Nagu eelnevalt otsimise juures nii ka siin võimaldab lisandunud parameetrile vaikeväärtuse jätmine kasutada funktsiooni samaaegselt nii senini kehtinud kahe parameetriga kohas (SELECT-lause ning valiku HTMLi sees olev nimi) kui ka uues kohas, kus antakse ette id, millist rida andmete seast ette kerida. Kui id-parameeter puudub, siis antakse sellele vaikimisi väärtuseks tühi tekst. Ning kui sellise väärtusega id-d pole (üldjuhul ei tohiks olla), siis lihtsalt eraldi ei valitagi midagi välja, rippmenüü tuleb nähtavale nii nagu ennegi. Kui aga funktsioonile anti ettekeritav id ning sarnane id leidub ka näidatavate andmete seas, siis lisatakse vastavale valikule parameeter selected=’selected’. Koodi mugavamaks kirjutamiseks on see toimetus jagatud kolme ritta. Vaikimisi pannakse lisandit hoidvale muutujale väärtuseks tühi tekst, st. et selle muutuja väärtuse lisamine ei muuda väljundit kuhugi. Järgmise tingimusega vaadatakse, et kas sinna on selected-atribuut põhjust sisse kirjutada. Ning kui kirjutati, siis jõuab see kolmandal real ilusti ka vastava option-rea kirjeldusse.

 $lisand=""; 
 if($id==$valitudid){$lisand=" selected='selected'";} 
 $tulemus.="<option value='$id' $lisand >$sisu</option>"; 

 function looRippMenyy($sqllause, $valikunimi, $valitudid=""){ 
 global $yhendus; 
 $kask=$yhendus->prepare($sqllause); 
 $kask->bind_result($id, $sisu); 
 $kask->execute(); 
 $tulemus="<select name='$valikunimi'>"; 
 while($kask->fetch()){ 
 $lisand=""; 
 if($id==$valitudid){$lisand=" selected='selected'";} 
 $tulemus.="<option value='$id' $lisand >$sisu</option>"; 
 } 
 $tulemus.="</select>"; 
 return $tulemus; 
 } 

Ning nende toimetuste tulemusena tekib siis valitud rida juba muudetaval kujul ekraanile. Muutused küll veel kuhugile ei jõua, aga eks see tuleb siis järgmise sammuna üles tähendada.

Kauba andmete muutmiseks lisatakse taas sobiv funktsioon. Kindlasti tuleb muutmise juurest kaasa saata muudetava kauba id. Selleks oli ennist vormi sees rida

 <input type="hidden" name="muudetudid" value="<?=$kaup->id ?>" />

kus see id kaasa pandi.  Edasi koostatakse abifunktsioonide alla UPDATE-lause, kus id-numbriga määratud real vanad andmed uutega üle kirjutatakse. 

 function muudaKaup($kauba_id, $nimetus, $kaubagrupi_id, $hind){ 
 global $yhendus; 
 $kask=$yhendus->prepare("UPDATE kaubad SET nimetus=?, kaubagrupi_id=?, hind=?  WHERE id=?"); 
 $kask->bind_param("sidi", $nimetus, $kaubagrupi_id, $hind, $kauba_id);  $kask->execute(); 
 }

Kaupade lehe juures tuleb algusesse juurde kontroll – et kui vajutati muutmisnupule, siis käivitatakse muutmisfunktsioon koos ette antud uute andmetega.

 if(isSet($_REQUEST["muutmine"])){ 
 muudaKaup($_REQUEST["muudetudid"], $_REQUEST["nimetus"],  
 $_REQUEST["kaubagrupi_id"], $_REQUEST["hind"]);  } 

Ning võibki uue hinna kirjutada ja muudki parandused vajadusel siise viia.

Muutmisnupu vajutamise järgsel lehe avamisel ongi uuel kujul andmed siis nähtavad.

Järeltegemise hõlbustamiseks siis halduseks vajalike failide koodid tervikuna. kaubahaldus.php

<?php 
 require("abifunktsioonid.php"); 
 if(isSet($_REQUEST["grupilisamine"])){ 
 lisaGrupp($_REQUEST["uuegrupinimi"]); 
 header("Location: kaubahaldus.php"); 
 exit(); 
 } 
 if(isSet($_REQUEST["kaubalisamine"])){ 
 lisaKaup($_REQUEST["nimetus"], $_REQUEST["kaubagrupi_id"], $_REQUEST["hind"]);  header("Location: kaubahaldus.php"); 
 exit(); 
 } 
 if(isSet($_REQUEST["kustutusid"])){ 
 kustutaKaup($_REQUEST["kustutusid"]); 
 } 
 if(isSet($_REQUEST["muutmine"])){ 
 muudaKaup($_REQUEST["muudetudid"], $_REQUEST["nimetus"], 
 $_REQUEST["kaubagrupi_id"], $_REQUEST["hind"]);  } 
 $kaubad=kysiKaupadeAndmed(); 
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml">
 <head> 
 <title>Kaupade leht</title> 
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />  </head> 
 <body>  
 <form action="kaubahaldus.php"> 
 <h2>Kauba lisamine</h2> 
 <dl> 
 <dt>Nimetus:</dt> 
 <dd><input type="text" name="nimetus" /></dd> 
 <dt>Kaubagrupp:</dt> 
 <dd><?php 
 echo looRippMenyy("SELECT id, grupinimi FROM kaubagrupid",   "kaubagrupi_id"); 
 ?> 
 </dd> 
 <dt>Hind:</dt> 
 <dd><input type="text" name="hind" /></dd> 
 </dl> 
 <input type="submit" name="kaubalisamine" value="Lisa kaup" />  <h2>Grupi lisamine</h2> 
 <input type="text" name="uuegrupinimi" /> 
 <input type="submit" name="grupilisamine" value="Lisa grupp" />  </form> 
 <form action="kaubahaldus.php"> 
 <h2>Kaupade loetelu</h2> 
 <table> 
 <tr> 
 <th>Haldus</th> 
 <th>Nimetus</th> 
 <th>Kaubagrupp</th> 
 <th>Hind</th> 
 </tr> 
 <?php foreach($kaubad as $kaup): ?> 
 <tr> 
 <?php if(isSet($_REQUEST["muutmisid"]) && 
 intval($_REQUEST["muutmisid"])==$kaup->id): ?>  <td> 
 <input type="submit" name="muutmine" value="Muuda" />  <input type="submit" name="katkestus" value="Katkesta" />  <input type="hidden" name="muudetudid" value="<?=$kaup->id ?>" />  </td> 
 <td><input type="text" name="nimetus" value="<?=$kaup->nimetus ?>" /></td>  <td><?php 
 echo looRippMenyy("SELECT id, grupinimi FROM kaubagrupid",   "kaubagrupi_id", $kaup->kaubagrupi_id);  ?></td> 
 <td><input type="text" name="hind" value="<?=$kaup->hind ?>" /></td>  <?php else: ?>  
 <td><a href="kaubahaldus.php?kustutusid=<?=$kaup->id ?>"  onclick="return confirm('Kas ikka soovid kustutada?')">x</a>  <a href="kaubahaldus.php?muutmisid=<?=$kaup->id ?>">m</a>  </td> 
 <td><?=$kaup->nimetus ?></td> 
 <td><?=$kaup->grupinimi ?></td> 
 <td><?=$kaup->hind ?></td> 
 <?php endif ?> 
 </tr> 
 <?php endforeach; ?> 
 </table> 
 </form> 
 </body> 
</html> 

ning abifunktsioonid.php

<?php 
 $yhendus=new mysqli("localhost", "jaagup", "xxxxxx", "jaagup");
  
 function kysiKaupadeAndmed($sorttulp="nimetus", $otsisona=""){ 
 global $yhendus; 
 $lubatudtulbad=array("nimetus", "grupinimi", "hind"); 
 if(!in_array($sorttulp, $lubatudtulbad)){ 
 return "lubamatu tulp"; 
 } 
 $otsisona=addslashes(stripslashes($otsisona)); 
 $kask=$yhendus->prepare("SELECT kaubad.id, nimetus, grupinimi, kaubagrupi_id, hind  FROM kaubad, kaubagrupid 
 WHERE kaubad.kaubagrupi_id=kaubagrupid.id 
 AND (nimetus LIKE '%$otsisona%' OR grupinimi LIKE '%$otsisona%')  ORDER BY $sorttulp"); 
 //echo $yhendus->error; 
 $kask->bind_result($id, $nimetus, $grupinimi, $kaubagrupi_id, $hind);  $kask->execute(); 
 $hoidla=array(); 
 while($kask->fetch()){ 
 $kaup=new stdClass(); 
 $kaup->id=$id; 
 $kaup->nimetus=htmlspecialchars($nimetus); 
 $kaup->grupinimi=htmlspecialchars($grupinimi); 
 $kaup->kaubagrupi_id=$kaubagrupi_id; 
 $kaup->hind=$hind; 
 array_push($hoidla, $kaup); 
 } 
 return $hoidla; 
 } 
  
 /** 
 * Luuakse HTML select-valik, kus v6etakse v22rtuseks sqllausest tulnud  * esimene tulp ning n2idatakse teise tulba oma. 
 */ 
 function looRippMenyy($sqllause, $valikunimi, $valitudid=""){ 
 global $yhendus; 
 $kask=$yhendus->prepare($sqllause); 
 $kask->bind_result($id, $sisu); 
 $kask->execute(); 
 $tulemus="<select name='$valikunimi'>"; 
 while($kask->fetch()){ 
 $lisand=""; 
 if($id==$valitudid){$lisand=" selected='selected'";} 
 $tulemus.="<option value='$id' $lisand >$sisu</option>"; 
 } 
 $tulemus.="</select>"; 
 return $tulemus; 
 } 
/* 
 function looRippMenyy($sqllause, $valikunimi){ 
 global $yhendus; 
 $kask=$yhendus->prepare($sqllause); 
 $kask->bind_result($id, $sisu); 
 $kask->execute(); 
 $tulemus="<select name='$valikunimi'>"; 
 while($kask->fetch()){ 
 $tulemus.="<option value='$id'>$sisu</option>"; 
 } 
 $tulemus.="</select>"; 
 return $tulemus; 
 } 
*/ 
  
 function lisaGrupp($grupinimi){ 
 global $yhendus; 
 $kask=$yhendus->prepare("INSERT INTO kaubagrupid (grupinimi)  VALUES (?)"); 
 $kask->bind_param("s", $grupinimi); 
 $kask->execute(); 
 }
  
 function lisaKaup($nimetus, $kaubagrupi_id, $hind){ 
 global $yhendus; 
 $kask=$yhendus->prepare("INSERT INTO  
 kaubad (nimetus, kaubagrupi_id, hind) 
 VALUES (?, ?, ?)"); 
 $kask->bind_param("sid", $nimetus, $kaubagrupi_id, $hind); 
 $kask->execute(); 
 } 
  
 function kustutaKaup($kauba_id){ 
 global $yhendus; 
 $kask=$yhendus->prepare("DELETE FROM kaubad WHERE id=?"); 
 $kask->bind_param("i", $kauba_id); 
 $kask->execute(); 
 } 
  
 function muudaKaup($kauba_id, $nimetus, $kaubagrupi_id, $hind){ 
 global $yhendus; 
 $kask=$yhendus->prepare("UPDATE kaubad SET nimetus=?, kaubagrupi_id=?, hind=?  WHERE id=?"); 
 $kask->bind_param("sidi", $nimetus, $kaubagrupi_id, $hind, $kauba_id);  $kask->execute(); 
 } 
 //---------------  
 if( array_pop(explode("/", $_SERVER["PHP_SELF"]))=="abifunktsioonid.php"): ?> 
<pre> 
<?php 
 print_r(kysiKaupadeAndmed("hind", "fass\\aad")); 
?> 
</pre> 
<?php endif ?> 

Ülesanne:

Antud konspekti järgi sul on tekkinud 3 faili:

abifunktsioonid.php
kaubaotsing.php
kaubahaldus.php

  1. Tee üldine koond veebileht – index.php, mis võimaldab KÕIK CRUD operatsioonid kaupadega, kaupade sorteerimine ning otsing.
    koodilõigud on kommenteeritud.
  1. Tühjad kaubad ja kaubagrupid ei tohi lisada.
  2. Kaubagrupide lisamises kontrollitakse, et nad ei dubleeri.
  3. Lisada header ja kasutajasõbralik css (tabel peab olema responsive)