Invoeren van gegevens

Inleiding Introductie invoeren Praktijkvoorbeeld Productlijst en invoer

Inleiding

In het vorige hoofdstukken hebben we geleerd om een connectie met een database management service te leggen en gegevens op te vragen uit deze database. Er is ook een begin gemaakt met een eenvoudige website voor de administratie vann een webwinkel. Gegevens opvragen is belangrijk, maar even belangrijk is het opslaan van gegevens in de database. We gaan nu de eenvoudige website uitbreiden met de invoer van een nieuw product. Een HTML formulier en de verwerking van eenformulier zijn daarbij natuurlijk een noodzaak. Ben je die techniek vergeten kijk dan in de cursus Interactieve website: PhP . Hoofdstuk 3 in die cursus geeft het snelst het gewenste inzicht.

Aan het einde van dit hoofdstuk weet je :

  • welke gegevens nodig zijn om in te voeren;
  • welke commando's een rol spelen bij de invoering;
  • kun je zelf gegevens invoeren in een database;

Invoeren van gegevens

Dit hoofdstuk ga je gegevens invoeren in een database. Het opslaan van gegevens vanuit php vindt ook weer plaats via SQL code. In de regel hieronder vind je de code voor het invoeren van een product vanuit php (noodzakelijk is natuurlijk dat de connectie al aanwezig is).
$query = "INSERT INTO product (id, naam, prijs, voorraad, omschrijving) VALUES ('', '$naam','$prijs','$voorraad','$omschrijving')";
$resultaat = $db->query($query);
Merk op dat voor het veld id een lege waarde ('') wordt verstuurd. De reden is dat in mysql automatische nummering voor dit veld is ingeschakeld en krijgt bij invoer automatisch een unieke waarde toegewezen. Het veld kan om deze reden ook volledig worden weggelaten.
$query = "INSERT INTO product (naam, prijs, voorraad, omschrijving) VALUES ('$naam','$prijs','$voorraad','$omschrijving')";
$resultaat = $db->query($query);
De variabelen $naam, $prijs, $voorraad en $omschrijving' bevatten de waarden die in de database moeten worden opgeslagen. Deze moeten dus een waarde krijgen en dat kan met behulp van een HTML formulier. Dit wordt het onderwerp van de volgende paragraaf.

Praktijkvoorbeeld

Opdrachten
  1. In voorbeeld 3 hieronder is een uitwerking te zien voor het invoeren van gegevens, samen met de code uit het vorige hoofdstuk. In de onderstaande code is met gele achtergrond aangegeven welke code is toegevoegd. We gebruiken weer de switch techniek om onderscheid te maken tussen de verschillende acties.
    1. Sla de eerste code in een bestand genoemd: index.php op.
    2. Voeg de functies in het tweede, derde en vierde 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 3 hieronder kom je de functie real_escape_string tegen. Deze zorgt ervoor dat er geen gevaarlijke sql code door een gebruiker kan worden ingevoerd, het zogenaamde sql injection. Ben je geïnteresseerd in het sql injection probleem dan staat niets je in de weg om in de laatste periode van het laatste de keuzemodule "Security" te bestuderen.
voorbeeld 3: index.php
<?php
//Laad database code
require_once("database.php");
//Laad algemene code
require_once("algemeen.php");
//Laad code voor de acties met betrekking tot producten die we op de database gaan doen
require_once("product.php");

$menu = getMenu(); // Haal het menu door de functie getMenu() uit algemeen.php op te roepen
$uitvoer="";
$actie="";
if( isset($_POST['actie']) && !empty($_POST['actie']))
{
 $actie=$_POST['actie'];
}
switch($actie)
{
 case "Invoeren":
          $uitvoer=artikelInvoeren($db); // Voer de functie artikelInvoeren() in acties.php uit
          break;
 case "Voeg Product Toe":
    // Voer de functie toonArtikelInvoerTabel in acties.php uit met 4 lege waarde fout paren
 		  $uitvoer=toonArtikelInvoerTabel(legeInvoerEnFout(4),true);  
          break;
 case "Toon Artikelen":
 default: $uitvoer=toonArtikelenLijst();
}

/* Met onderstaand echo commando kun je een stuk text tussen END en END;
 naar de client computer sturen
*/
echo <<<END
<!DOCTYPE html >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />    
<title>Page title</title>
<style type="text/css">
td
{
  border:1px groove black;
}
</style>
</head>
<body>
<h1>Garagebedrijf Nieuwenhuis</h1>
<hr>
<form action='{$_SERVER['PHP_SELF']}' method="post" >
$menu
</form>
<hr>
<form action='{$_SERVER['PHP_SELF']}' method="post" >
$uitvoer 
</form>
</body>
</html>
END;
//einde van het PhP blok
?>
voorbeeld 3: functies voor algemeen.php

De functie getMenu

/*
 getMenu geeft de code voor het menu in de website
 */
function getMenu()
{
 $uitvoer=<<<END
 <table class='menu' summary="">
  <tr>
    <td><input type="submit" name="actie" value="Toon Artikelen">
    </td>
    <td><input type="submit" name="actie" value="Voeg Product Toe">
    </td>
  </tr>
 </table>
END;
 return $uitvoer; 
}

De functie legeInvoerEnFout

De volgende functie voegen we toe omdat die straks bij het invoeren van medewerkers en klanten ook nuttig is. Bij ieder veld dat je moet invullen hoort een waarde en je kan een fout bij het invullen maken. De waarden en de fouten moeten we kunnen volgen tussen de verschillende schermen.

/**
 * legeInvoerEnFout maakt een dubbele array met lege strings 
 * die staan voor waarde-fout paren
 * $aantal is aantal gewenste waarde-fout paren
 */
function legeInvoerEnFout($aantal)
{
	$resultaat = array();
	// voeg per iteratie een waarde-fout paar toe
	for($i=0;$i<$aantal;$i++) $resultaat[$i]=array("",""); 
	return $resultaat;
}
voorbeeld 3: functies voor product.php

De functie toonArtikelInvoerTabel

De functie toonArtikelInvoerTabel is een voorbeeld van een functie die meerdere argumenten nodig heeft om te kunnen werken.

/**
 * toonArtikelInvoerTabel toont de tabel waarmee een product kan worden ingevoerd
 * of het resultaat van de invoer actie kan laten zien
 * param $productEnFout: lijst van producteigenschappen bestaande uit 
 * 4 invoer velden en eventuele fouten
 *		[
			[naam,foutnaam],
			[prijs,foutprijs],
			[voorraad,foutvoorraad],
			[omschrijving,omschrijving],
 *		]
 * param $alsFormulier true als formulier getoond moet worden, 
                       false als alleen de informatie getoond moet worden
 */
function toonArtikelInvoerTabel($productEnFout,$alsFormulier)
{
 $invoer1="";
 $invoer2="";
 $invoer3="";
 $invoer4="";
 $invoerknop="";
 // Voeg hier eigen commentaar toe.
 print_r($productEnFout);
 // Voeg hier eigen commentaar toe.
 if($alsFormulier)
 {
 	$invoer1="<input name='naam' value='{$productEnFout[0][0]}'/>"; // naam
 	$invoer2="<input name='prijs' value='{$productEnFout[1][0]}'/>"; // prijs
	$invoer3="<input name='voorraad' value='{$productEnFout[2][0]}'/>"; // voorraad
	$invoer4="<textarea name='omschrijving'/>{$productEnFout[3][0]}</textarea>"; // omschrijving
	
	$invoerknop=<<<END
  <tr>
    <td colspan="3">
      <input type="submit" name="actie" value="Invoeren"/>
   </td>
  </tr>
END;
 }
 else
 {
	$invoer1=$productEnFout[0][0]; // naam
	$invoer2=$productEnFout[1][0]; // prijs
	$invoer3=$productEnFout[2][0]; // voorraad
 	$invoer4=$productEnFout[3][0]; // omschrijving
 }
 // Voeg hier eigen commentaar toe.
 $uitvoer=<<<END
  <h3>Voer artikel in</h3>
  <table>
  <tr>
    <td>Geef naam artikel</td>
    <td>$invoer1</td>
    </td>
    <td>{$productEnFout[0][1]}</td>
  </tr>
  <tr>
    <td>Geef prijs</td>
    <td>$invoer2</td>
    <td>{$productEnFout[1][1]}</td>
  </tr>
  <tr>
    <td>Geef aantal in voorraad</td>
    <td>$invoer3</td>
    <td>{$productEnFout[2][1]}</td>
  </tr>
  <tr>
    <td>Geef omschrijving</td>
    <td>$invoer4</td>
    <td>{$productEnFout[3][1]}</td>
  </tr>
  $invoerknop
  </table>
END;
 return $uitvoer;
}

De functie artikelInvoeren

De functie artikelInvoeren is de langste van het stel.
/*
 * artikelInvoeren leest de invoer uit de $_POST variabele,
 * test de invoer, geeft foutmeldingen bij mislukkingen en voegt als
 * er niets misgaat een record toe aan de database. 
 * param &$db: verwijzing naar de database
 */
function artikelInvoeren(&$db)
{
 $fout1="";
 $fout2="";
 $fout3="";
 $fout4="";
 $naam = "";
 $prijs = "";
 $voorraad = "";
 $omschrijving = "";
 $uitvoer ="";
 $melding="";

 //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 
   // $db->real_escape_string() functie wordt gebruikt om foute invoer te voorkomen
   if(isset($_POST["prijs"]))
   {
    $prijs = $db->real_escape_string($_POST["prijs"]);
   }
   if(isset($_POST["naam"]))
   {
    $naam = $db->real_escape_string($_POST["naam"]);
   }
   if(isset($_POST["voorraad"]))
   {
    $voorraad = $db->real_escape_string($_POST["voorraad"]);
   }
   if(isset($_POST["omschrijving"]))
   {
    $omschrijving= $db->real_escape_string($_POST["omschrijving"]);
   }
   // test of er waarden en getallen zijn
   // Voeg hier eigen commentaar toe.
   if( !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
        $query = "INSERT INTO product (naam,prijs,voorraad,omschrijving) VALUES ('$naam','$prijs','$voorraad','$omschrijving')";

        if($resultaat = $db->query($query))        {
          $uitvoer = toonArtikelInvoerTabel( array(
						array($naam,$fout1),
						array($prijs,$fout2),
						array($voorraad,$fout3),
						array($omschrijving,$fout4)
					),false);
          $uitvoer .= "Artikel is ingevoerd";
        }
        else
        {
          $uitvoer = toonArtikelInvoerTabel( array(
					array($naam,$fout1),
					array($prijs,$fout2),
					array($voorraad,$fout3),
					array($omschrijving,$fout4)
				),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 = toonArtikelInvoerTabel( array(
					array($naam,$fout1),
					array($prijs,$fout2),
					array($voorraad,$fout3),
					array($omschrijving,$fout4)
				),true);
   }
   //sluit database
   verbreekVerbinding($db);
 }
 return $uitvoer;
}