In dit hoofdstuk ga je kennismaken met de laatste twee noodzakeleijke onderdelen van gegevensbeheer
met behulp van php MySQL: wijzigen en verwijderen.
Na dit onderdeel heb je dus alle bewerkingen op gegevens in de database gehad.
Elk onderdeel wordt weer behandeld vanuit het praktijkvoorbeeld.
Aan het einde van dit hoofdstuk weet je :
de sql commando's voor het wijzigen en verwijderen;
hoe wijzigen en verwijderen is opgebouwd;
hoe je wijzigen en verwijderen implementeert;
Introductie wijzigen
Als eerst is het belangrijk om je een beeld te vormen hoe je het 'wijzigen' wilt toepassen.
Stel je voor: je hebt net iets via een formulier in de database ingevoerd.
Nu wil je iets wijzigen. De te nemen stappen zijn: toon de oude informatie
in een formulier, pas de gegevens in dit formulier aan en druk op verzenden.
Drukken van knop wijzig links levert invoerscherm rechts
Op programmeer niveau betekent dit identificeer het record met het id.
Vraag met een sql instructie aan de sql management service om de gegevens,
verwerk die tot een formulier, lees het ingezonden
formulier en sla de nieuwe gegevens op via en sql instructie naar de sql management service.
Bekijk nogmaals de code uit het hoofdstuk weergeven. In de tabel vindt je
de knoppen wijzig en verwijder. Wijzig stuurt het formulier met actie=wijzig.
In de switch in index.php moet nu dus een case komen die deze actie afhandeld.
In het voorbeeld wordt deze actie afgehandeld door de functie toonArtikelWijzigTabel.
In het door toonArtikelWijzigTabel gemaakte tabel zit een knop met actie="Wijziging Doorvoeren".
In de switch in index.php moet nu dus een case komen die deze actie afhandeld.
In het voorbeeld wordt deze actie afgehandeld door de functie productWijzigen.
Deze functie moet de voor een speciek product volgende SQL instructie uitvoeren:
UPDATE product SET naam = 'Motorolie', prijs = '32.95', voorraad= '70',
omschrijving='Motorolie van zeer hoge kwaliteit' WHERE id = 103;
Verder zal je geen nieuwe sql commando's tegenkomen.
Een kleine opmerking: de primaire sleutel productid mag natuurlijk niet worden gewijzigd.
Daarom is dit veld niet bij SET te vinden.
We zullen net als in het
vorige hoofdstuk SQL injection gaan voorkomen door prepared statements te gebruiken. De
query wordt dan:
$query="UPDATE product SET naam = :naam, prijs = :prijs, voorraad= :voorraad,
omschrijving= :omschrijving WHERE id = :productid";
Praktijkvoorbeeld wijzigen
Opdrachten
Het onderstaande praktijkvoorbeeld over wijzigen behoeft wel wat uitleg.
Dit voorbeeld bestaat namelijk uit drie bestanden waarvan je er al een hebt gemaakt. De afbeelding hieronder
geeft de schematische weergave van bovenstaande informatie.
In voorbeeld 4 hieronder voegen we weer code toe aan de bestanden
index.php en actie.php
Voeg de eerste code in op de juiste plaats in het bestand index.php.
Voeg de functies in het tweede en derde code blok toe aan het bestand actie.php.
Bekijk het resultaat.
Bestudeer de code goed en begrijp waarom alles werkt zoals het werkt.
Voeg eigen commentaar toe waarin je ook uitlegt hoe alles werkt.
In voorbeeld 4 is de volgende regels gebruikt:
<input name="artikelnummer" value="$an" readonly>
Waarom is deze wel zichtbaar in het formulier? Wat heeft readonly hiermee te maken?
voorbeeld 4: index.php
Voeg de volgende cases toe aan de switch in index.php
case "wijzig":
$uitvoer=toonArtikelWijzigTabel(array_fill(0,4,""),true); // Voer de functie toonArtikelWijzigTabel met 4 nu nog lege fouten in product.php uit
break;
case "Wijziging Doorvoeren":
$uitvoer=productWijzigen(); // Voer de functie ProductWijzigen() in product.php uit
break;
voorbeeld 4: product.php
Voeg de volgende functies toe aan product.php
De functie toonArtikelWijzigTabel
/*
* toonArtikelWijzigTabel geeft een tabel met invoervelden gevuld de waarden voor
* het in de $_POST aanwezige productid veld en gegeven als formulier als $alsFormulier de
* waarde true heeft.
* param &fouten: array met 4 mogelijke fouten
* $fouten[0]: melding voor als er bij de invoer van naam een fout is opgetreden
* $fouten[1]: melding voor als er bij de invoer van prijs een fout is opgetreden
* $fouten[2]: melding voor als er bij de invoer van voorraad een fout is opgetreden
* $fouten[3]: melding voor als er bij de invoer van omschrijving een fout is opgetreden
* param $alsFormulier: true -> invulformulier; false -> tabel
*/
function toonArtikelWijzigTabel($fouten,$alsFormulier)
{
$productid = "";
$naam = "";
$prijs = "";
$voorraad = "";
$omschrijving = "";
$uitvoer ="";
$melding=""; // initialisatie van variabele om connectie foutmelding in te plaatsen
global $db; // Haal een verwijzing naar de huidige connectie in database.php
// Voeg hier eigen commentaar toe.
if(isset($_POST["productid"]))
{
if(!$db) maakVerbinding($db,$melding);
if(!$db) // test verbinding
{
// mislukt
$uitvoer=$melding;
}
else
{
try
{
$productid = $_POST["productid"];
//opdracht geven aan database
// Voeg hier eigen commentaar toe.
$query = "SELECT * FROM product WHERE id=:productid";
$opdracht = $db->prepare($query);
$opdracht->bindParam(':productid', $productid);
$opdracht->execute();
list($nummer,$naam,$prijs,$voorraad, $omschrijving) = $opdracht->fetch(PDO::FETCH_NUM);
$invoer1="";
$invoer2="";
$invoer3="";
$invoer4="";
$invoer5="";
$invoerknop="";
// Voeg hier eigen commentaar toe.
if($alsFormulier)
{
$invoer1="<input name='naam' value='$naam'/>";
$invoer2="<input name='prijs' value='$prijs'/>";
$invoer3="<input name='voorraad' value='$voorraad'/>";
$invoer4="<textarea name='omschrijving'/>$omschrijving</textarea>";
// Voeg hier eigen commentaar toe.
$invoer5="<input name='productid' value='$productid' readonly />";
$invoerknop=<<<END
<tr>
<td colspan="3">
<input type="submit" name="actie" value="Wijziging Doorvoeren"/>
</td>
</tr>
END;
}
else
{
$invoer1=$naam;
$invoer2=$prijs;
$invoer3=$voorraad;
$invoer4=$omschrijving;
$invoer5=$productid;
}
$uitvoer=<<<END
<h3>Wijzig artikel</h3>
<table>
<tr>
<td>product nummer</td>
<td colspan="2">$invoer5</td>
</tr>
<tr>
<td>Geef naam artikel</td>
<td>$invoer1</td>
<td>{$fouten[0]}</td>
</tr>
<tr>
<td>Geef prijs</td>
<td>$invoer2</td>
<td>{$fouten[1]}</td>
</tr>
<tr>
<td>Geef aantal in voorraad</td>
<td>$invoer3</td>
<td>{$fouten[2]}</td>
</tr>
<tr>
<td>Geef omschrijving</td>
<td>$invoer4</td>
<td>{$fouten[3]}</td>
</tr>
$invoerknop
</table>
END;
}
catch(PDOException $e) // Er is een fout opgetreden in SQL
{
$uitvoer .= "Fout uitvoeren query! $query";
}
//sluit database
verbreekVerbinding();
}
}
else
{
$uitvoer = "Product id niet aanwezig!";
}
return $uitvoer;
}
De functie productWijzigen
/*
ProductWijzigen leest de invoer uit de $_POST variabele,
test de invoer, geeft foutmeldingen bij mislukkingen en veranderd als
er niets misgaat het record in de database.
*/
function productWijzigen()
{
$fout1="";
$fout2="";
$fout3="";
$fout4="";
$productid="";
$naam = "";
$prijs = "";
$voorraad = "";
$omschrijving = "";
$uitvoer ="";
$melding=""; // initialisatie van variabele om connectie foutmelding in te plaatsen
global $db; // Haal een verwijzing naar de huidige connectie in database.php
//verbinding maken met database
if(!$db) maakVerbinding($db,$melding);
if(!$db) // test verbinding
{
// mislukt
return $melding;
}
else
{
// isset is een functie die kijkt of een element in een array bestaat
// post variabelen ophalen
if(isset($_POST["productid"]))
{
$productid = $_POST["productid"];
}
if(isset($_POST["prijs"]))
{
$prijs = $_POST["prijs"];
}
if(isset($_POST["naam"]))
{
$naam = $_POST["naam"];
}
if(isset($_POST["voorraad"]))
{
$voorraad = $_POST["voorraad"];
}
if(isset($_POST["omschrijving"]))
{
$omschrijving= $_POST["omschrijving"];
}
// test of er waarden en getallen zijn
// Voeg hier eigen commentaar toe.
if( !empty($productid) && is_numeric($productid) &&
!empty($naam) &&
((!empty($prijs) && is_numeric($prijs))||$prijs=="0") &&
((!empty($voorraad) && is_numeric($voorraad))||$voorraad=="0") &&
!empty($omschrijving) )
{
// Maak van getal1 een double
$prijs=(double)$prijs;
//opdracht geven aan database
// Voeg hier eigen commentaar toe.
try
{
$query = $query = "UPDATE product SET naam = :naam, prijs = :prijs, voorraad= :voorraad, omschrijving=:omschrijving WHERE id = :productid";
$opdracht = $db->prepare($query);
$opdracht->bindParam(':productid', $productid);
$opdracht->bindParam(':naam', $naam);
$opdracht->bindParam(':prijs', $prijs);
$opdracht->bindParam(':voorraad', $voorraad);
$opdracht->bindParam(':omschrijving', $omschrijving);
$opdracht->execute();
$uitvoer = toonArtikelWijzigTabel(array("","","",""),false);
$uitvoer .= "Artikel is gewijzigd";
}
catch(PDOException $e) // Er is een fout opgetreden in SQL
{
$uitvoer = toonArtikelWijzigTabel(array("","","",""),true);
$uitvoer .= "Fout uitvoeren query! $query";
}
}
else // er is een fout
{
// Voeg hier eigen commentaar toe.
if(empty($naam)){$fout1="Er moet een naam worden ingevuld";}
if(empty($prijs)){$fout2="Er moet een getal worden ingevuld";}
elseif(!is_numeric($prijs)){$fout2="$prijs is geen getal";}
if(empty($voorraad)){$fout3="Er moet een getal worden ingevuld";}
elseif(!is_numeric($voorraad)){$fout3="$voorraad is geen getal";}
if(empty($omschrijving)){$fout4="Er moet een omschrijving worden ingevuld";}
$uitvoer = toonArtikelWijzigTabel(array($fout1,$fout2,$fout3,$fout4),true);
}
//sluit database
verbreekVerbinding();
}
return $uitvoer;
}
Introductie verwijderen
Het verwijderen pakken we op dezelfde manier aan als bij wijzigen. Na het indrukken
van de knop verwijderen komt er een scherm om deze verwijdering te bevestigen.
Het indrukken van de knop zorgt voor
Ook hier zullen geen nieuwe commando's worden geintroduceerd.
Let even op de query hieronder: de primaire sleutel artikelnummer schrijf je ook hier alleen in de WHERE.
$query = "DELETE FROM product WHERE id = :productid";
Praktijkvoorbeeld verwijderen
Opdrachten
Het onderstaande praktijkvoorbeeld over verwijderen wordt aangeroepen via de knop verwijderen
in de productlijst. Er verschijnt een tussenscherm waarin om een bevestiging wordt gevraagd. Na het indrukken van de knop wordt het artikel verwijderd.
In voorbeeld 5 hieronder voegen we weer code toe aan de bestanden
index.php en product.php
Voeg de eerste code in op de juiste plaats in het bestand index.php.
Voeg de functies in het tweede en derde code blok toe aan het bestand product.php.
Bekijk het resultaat.
Bestudeer de code goed en begrijp waarom alles werkt zoals het werkt.
Voeg eigen commentaar toe waarin je ook uitlegt hoe alles werkt.
voorbeeld 5: index.php
Voeg de volgende cases toe aan de switch in index.php
case "verwijder":
$uitvoer=toonArtikelVerwijderTabel(true); // Voer de functie toonArtikelVerwijderTabel() in product.php uit
break;
case "Bevestig Verwijderen":
$uitvoer=productVerwijderen(); // Voer de functie ProductWijzigen() in product.php uit
break;
voorbeeld 5: product.php
De functie toonArtikelVerwijderTabel
/*
* toonArtikelVerwijderTabel toont een tabel met waarden voor
* het record behorende bij het in de $_POST aanwezige productid
* en wordt weergegeven als formulier als $alsFormulier de waarde true heeft.
* param $alsFormulier: true -> verzend formulier; false -> tabel
*/
function toonArtikelVerwijderTabel($alsFormulier)
{
$productid = "";
$naam = "";
$prijs = "";
$voorraad = "";
$omschrijving = "";
$uitvoer ="";
$melding=""; // initialisatie van variabele om connectie foutmelding in te plaatsen
global $db; // Haal een verwijzing naar de huidige connectie in database.php
if(!$db) $db=maakVerbinding($db,$melding);
if(!$db) // test verbinding
{
// mislukt
$uitvoer=$melding;
}
else
{
if(isset($_POST["productid"]))
{
try
{
$productid = $_POST["productid"];
//opdracht geven aan database
// Voeg hier eigen commentaar toe.
$query = "SELECT * FROM product WHERE id=:productid";
$opdracht = $db->prepare($query);
$opdracht->bindParam(':productid', $productid);
$opdracht->execute();
list($nummer,$naam,$prijs,$voorraad, $omschrijving) = $opdracht->fetch(PDO::FETCH_NUM);
$invoer="<input name='productid' value='$productid' readonly />";
$invoerknop="";
// Voeg hier eigen commentaar toe.
if($alsFormulier)
{
$invoerknop=<<<END
<tr>
<td colspan="3">
<input type="submit" name="actie" value="Bevestig Verwijderen"/>
</td>
</tr>
END;
}
$uitvoer=<<<END
<h3>Verwijder artikel</h3>
<table>
<tr>
<td>product nummer</td>
<td>$invoer</td>
</tr>
<tr>
<td>naam artikel</td>
<td>$naam</td>
</tr>
<tr>
<td>prijs</td>
<td>$prijs</td>
</tr>
<tr>
<td>voorraad</td>
<td>$voorraad</td>
</tr>
<tr>
<td>omschrijving</td>
<td>$omschrijving</td>
</tr>
$invoerknop
</table>
END;
}
catch(PDOException $e) // Er is een fout opgetreden in SQL
{
$uitvoer .= "Fout uitvoeren query! $query";
}
}
else
{
$uitvoer = "Product id niet aanwezig!";
}
//sluit database
verbreekVerbinding();
}
return $uitvoer;
}
De functie productVerwijderen
/*
* productVerwijderen leest de invoer uit de $_POST variabele,
* verwijdert het record met het juiste product id.
*/
function productVerwijderen()
{
$productid="";
$melding=""; // initialisatie van variabele om connectie foutmelding in te plaatsen
global $db; // Haal een verwijzing naar de huidige connectie in database.php
//verbinding maken met database
if(!$db) maakVerbinding($db,$melding);
if(!$db) // test verbinding
{
// mislukt
$uitvoer=$melding;
}
else
{
// isset is een functie die kijkt of een element in een array bestaat
// post variabelen ophalen
// Voeg hier eigen commentaar toe.
if(isset($_POST["productid"]))
{
$productid = $_POST["productid"];
}
// test of er waarden en getallen zijn
if( !empty($productid) && is_numeric($productid) )
{
//opdracht geven aan database
// Voeg hier eigen commentaar toe.
try
{
$query = "DELETE FROM product WHERE id = :productid";
$opdracht = $db->prepare($query);
$opdracht->bindParam(':productid', $productid);
$opdracht->execute();
$uitvoer = "Artikel $productid is verwijderd.<br/>";
$uitvoer .= toonArtikelenLijst($db);
}
catch(PDOException $e) // Er is een fout opgetreden in SQL
{
$uitvoer = toonArtikelVerwijderTabel($db,false);
$uitvoer .= "Fout uitvoeren query! $query";
}
}
else // er is een fout
{
$uitvoer = "Geen product id";
}
//sluit database
verbreekVerbinding();
}
return $uitvoer;
}