Wijzigen en verwijderen

Inleiding Introductie wijzigen Praktijkvoorbeeld wijzigen Introductie verwijderen Praktijkvoorbeeld verwijderen

Inleiding

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.

  1. In voorbeeld 4 hieronder voegen we weer code toe aan de bestanden index.php en actie.php
    1. Voeg de eerste code in op de juiste plaats in het bestand index.php.
    2. Voeg de functies in het tweede en derde code blok toe aan het bestand actie.php.
    3. Bekijk het resultaat.
    4. Bestudeer de code goed en begrijp waarom alles werkt zoals het werkt.
    5. Voeg eigen commentaar toe waarin je ook uitlegt hoe alles werkt.
  2. 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.

  1. In voorbeeld 5 hieronder voegen we weer code toe aan de bestanden index.php en product.php
    1. Voeg de eerste code in op de juiste plaats in het bestand index.php.
    2. Voeg de functies in het tweede en derde code blok toe aan het bestand product.php.
    3. Bekijk het resultaat.
    4. Bestudeer de code goed en begrijp waarom alles werkt zoals het werkt.
    5. 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; 
}