U bent hier

Het toevoegen van gegevens

logo

Voor het toevoegen van gegevens binnen de applicatie Adressenlijst maken we gebruik van de drie vorige artikelen in de reeks fundamentals.
Tevens maken we gebruik van een PHP editor.

Dit artikel gaat ervan uit dat je de artikelen

gelezen hebt.

Het toevoegen van een adres.


Eerst weer het volledige script.


  Het volledige script  
<?php
/*
	van Wijhe Consultancy
	oktober 2012
	nieuw.php
*/


//-----Het beschikbaar maken van de MySQL variabelen
	include ('config.php');

	
//-----Het beschikbaar maken van de functies
	include ('functies.php');

	
//-----Het netjes openen van een html file
	include('hoofd.php');

	
// formulier nog niet verstuurd
// laat het invul formulier hier zien
if ( $_SERVER['REQUEST_METHOD'] == "GET" )
{
	echo '<form action="'.$_SERVER['SCRIPT_NAME'].'" method="post">'."\n" ;
	
	echo '<table cellspacing="5" cellpadding="5" border=0>'."\n" ;
	echo '<tr>'."\n" ;
	echo '<td colspan=2><b><font color=red>*</font><font size="-1"> = verplicht</font></b></td>'."\n" ;
	echo '</tr>'."\n" ;
	echo '<tr>'."\n" ;
		echo '<td valign="top">Dhr / Mw <font color=red>*</font></font></b></td>'."\n" ;
		echo '<td><input size="50" maxlength="250" type="text" name="mv"></td>'."\n" ;
	echo '</tr>'."\n" ;
	echo '<tr>'."\n" ;
		echo '<td valign="top">Voorletter(s) <font color=red>*</font></b></td>'."\n" ;
		echo '<td><input size="50" maxlength="250" type="text" name="voorletters"></td>'."\n" ;
	echo '</tr>'."\n" ;
	echo '<tr>'."\n" ;
		echo '<td valign="top">Voornaam <font color=red>*</font></td>'."\n" ;
		echo '<td><input size="50" maxlength="250" type="text" name="voornaam"></td>'."\n" ;
	echo '</tr>'."\n" ;
	echo '<tr>'."\n" ;
		echo '<td valign="top">Tussenvoegsel </td>'."\n" ;
		echo '<td><input size="50" maxlength="250" type="text" name="tussenvoegsel"></td>'."\n" ;
	echo '</tr>'."\n" ;
	echo '<tr>'."\n" ;
		echo '<td valign="top">Achternaam <font color=red>*</font></td>'."\n" ;
		echo '<td><input size="50" maxlength="250" type="text" name="naam"></td>'."\n" ;
	echo '</tr>'."\n" ;
	echo '<tr>'."\n" ;
		echo '<td valign="top">Adres  / Huisnummer <font color=red>*</font></td>'."\n" ;
		echo '<td><input size="35" maxlength="250" type="text" name="straat"> <input size="15" maxlength="250" type="text" name="nummer"></td>'."\n" ;
	echo '</tr>'."\n" ;
	echo '<tr>'."\n" ;
		echo '<td valign="top">Postcode </td>'."\n" ;
		echo '<td><input size="50" maxlength="250" type="text" name="pc"></td>'."\n" ;
	echo '</tr>'."\n" ;
	echo '<tr>'."\n" ;
		echo '<td valign="top">Woonplaats <font color=red>*</font></td>'."\n" ;
		echo '<td><input size="50" maxlength="250" type="text" name="woonplaats"></td>'."\n" ;
	echo '</tr>'."\n" ;
	echo '<tr>'."\n" ;
		echo '<td valign="top">Telefoon</td>'."\n" ;
		echo '<td><input size="50" maxlength="250" type="text" name="telefoon"></td>'."\n" ;
	echo '</tr>'."\n" ;
	echo '<tr>'."\n" ;
		echo '<td valign="top">Geboorte datum ( dd-mm-yyyy )</td>'."\n" ;
		echo '<td><input size="50" maxlength="250" type="text" name="geb_datum"></td>'."\n" ;
	echo '</tr>'."\n" ;
	echo '<tr>'."\n" ;
		echo '<td valign="top">E-mail</td>'."\n" ;
		echo '<td><input size="50" maxlength="250" type="text" name="e_mail"></td>'."\n" ;
	echo '</tr>'."\n" ;
	echo '<tr>'."\n" ;
		echo '<td valign="top"> Opmerkingen </td>'."\n" ;
		echo '<td>'."\n" ;
		echo '<textarea name="omschrijving" rows="4" cols="50"></textarea>'."\n" ;
		echo '</td>'."\n" ;
	echo '</tr>'."\n" ;
	echo '<tr>'."\n" ;

	echo '<tr>'."\n" ;
		echo '<td colspan=2><input type="Submit" name="verstuurd" value="Voeg adres toe">'."\n" ;
		echo '<input type="Reset" value="Wis invoer">'."\n" ;
		echo '</td>'."\n" ;
	echo '</tr>'."\n" ;

	echo '</table>'."\n" ;

	echo '</form>'."\n" ;
	//-----
}
else
{
	//-----
	
	// maak foutenlijst array
	$foutenlijst 	= array();
	$teller 		= 0;

	
	// valideer tekst velden
	if ( !strlen( $_POST['mv'] ) ) 
	{ 
		$foutenlijst[$teller] = "Het volgende veld is niet ingevuld: <b>Dhr Mw</b>"; 
		$teller++; 
	}

	if ( !strlen($_POST['voorletters']) ) 
	{ 
		$foutenlijst[$teller] = "Het volgende veld is niet ingevuld: <b>Voorletter(s)</b>"; 
		$teller++; 
	}

	if ( !strlen($_POST['voornaam']) ) 
	{ 
		$foutenlijst[$teller] = "Het volgende veld is niet ingevuld: <b>Voornaam</b>"; 
		$teller++; 
	}
		
	if ( !strlen($_POST['naam']) ) 
	{ 
		$foutenlijst[$teller] = "Het volgende veld is niet ingevuld: <b>Achternaam</b>"; 
		$teller++; 
	}
		
	if ( !strlen($_POST['straat']) ) 
	{ 
		$foutenlijst[$teller] = "Het volgende veld is niet ingevuld: <b>Adres</b>"; 
		$teller++; 
	}

	if ( !strlen($_POST['nummer']) ) 
	{ 
		$foutenlijst[$teller] = "Het volgende veld is niet ingevuld: <b>Huisnummer</b>"; 
		$teller++; 
	}

	if ( !strlen($_POST['woonplaats']) )	
	{ 
		$foutenlijst[$teller] = "Het volgende veld is niet ingevuld: <b>Woonplaats</b>"; 
		$teller++; 
	}

	if ( !strlen($_POST['geb_datum']) )	
	{ 
		$geb_datum = "0000-00-00" ;
	}
	else
	{
		$geb_datum = format_datum_1($_POST['geb_datum']) ;
	}	
	
	// fouten controle.
	// en zo niet.
	if ( sizeof($foutenlijst) == '0' )
	{
		try
		{
			// Verzorg connectie naar MySQL
			$db_n = new PDO('mysql:host=localhost;dbname='.$database, $gebruiker, $wachtwoord);
			
			$db_n->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

			
			// Het opzetten en uitvoeren van de vraagstelling					   
			$st_n = $db_n->prepare("INSERT INTO ".$tabel."
									   ( mv,
										voorletters,
										voornaam,
										tussenvoegsel,
										naam,
										straat,
										nummer,
										pc,
										woonplaats,
										telefoon,
										email,
										geb_datum,
										opm )
							  VALUES( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) 
							  ") ;
									 
			$st_n->execute( array( $_POST['mv'], 
									$_POST['voorletters'], 
									$_POST['voornaam'], 
									$_POST['tussenvoegsel'], 
									$_POST['naam'], 
									$_POST['straat'], 
									$_POST['nummer'], 
									$_POST['pc'], 
									$_POST['woonplaats'], 
									$_POST['telefoon'], 
									$_POST['email'],  									
									$geb_datum, 
									$_POST['opm'] ) 	
								) ;
					
					
			//-----redirect dmv javascript
			echo '<script type="text/javascript">     '."\n" ;
			echo '<!--                                '."\n" ;
			echo '	window.location = "index.php"     '."\n" ;
			echo '//-->                               '."\n" ;
			echo '</script>                           '."\n" ;
			//-----/redirect dmv javascript		
		}
		catch(PDOException $e)
		{
			echo '<pre>'."\n" ; 
			echo '<table cellspacing=0 cellpadding=0 border=0>';
			echo '<tr><td> Regel: </td><td>'.$e->getLine().'</td></tr>'."\n" ; 
			echo '<tr><td> Bestand:  </td><td>'.$e->getFile().'</td></tr>'."\n" ; 
			echo '<tr><td> Foutmelding: </td><td>'.$e->getMessage().' </td></tr>'."\n" ; 
			echo '</table>'."\n" ; 
			echo '</pre>'."\n" ; 
		}		


	}
	else
	{		
		// er zijn fouten gevonden.
		// laat deze als lijst zien.
		echo 'De volgende fouten traden op :'."\n" ;
			

		echo '<ul>'."\n" ;
		for ( $x = '0'; $x < sizeof($foutenlijst); $x++ )
		{
			 echo '<li>'.$foutenlijst[$x].'</li>'."\n" ;
		}
		echo '</ul>'."\n" ;
	}
}
//-----/


//-----Weergeven van de onderste balk - einde_begin
	include("einde_begin.php");

//-----/

De uitleg

Het beschikbaar maken van de omgeving

De eerste regel zorgt ervoor dat er een connectie komt met de database.
De tweede regel zorgt ervoor dat er een aantal standaard functies beschikbaar komen.
De derde regel zorgt ervoor dat de begin lay-out van het formulier geopend wordt.

Al de deze drie files taan in de root van de applicatie.
Zie helemaal onderaan dit artikel voor de download link.

  Beschikbaar maken  
//-----Het beschikbaar maken van de MySQL variabelen
    include ('config.php');
 
     
//-----Het beschikbaar maken van de functies
    include ('functies.php');
 
     
//-----Het netjes openen van een html file
    include('hoofd.php');

Het formulier

Het formulier is voor zich sprekend.

Het begin is via de request_method.
Standaard staat deze op "GET".
Pas als het formulier verstuurd wordt, krijgt deze de "POST" waarde.



  Naam onderdeel  
// formulier nog niet verstuurd
// laat het invul formulier hier zien
if ( $_SERVER['REQUEST_METHOD'] == "GET" )
{
	// Actie bij GET
}
else
{
	// Actie bij POST
}


Het begin van de fouten afhandelings routine



  foutenlijst begin  

	//----- maak foutenlijst array
	$foutenlijst 	= array();
	$teller 		= 0;

	
	// valideer tekst velden
	if ( !strlen( $_POST['mv'] ) ) 
	{ 
		$foutenlijst[$teller] = "Het volgende veld is niet ingevuld: Dhr Mw"; 
		$teller++; 
	}



Er wordt eerst een lege array gemaakt genaamd $foutenlijst.
Deze kan dan als dat nodig is, gevuld worden met individuele fouten.

Er wordt daarna een variabele $teller op de begin waarde 0 gezet.


Het valideren kan dan beginnen.
In dit geval wordt er alleen gekeken of er een waarde is ingevuld.
Zo niet wordt de array $foutenlijst met een getal en een waarde gevuld.
Zo kun je voor elk veld zijn eigen validatie regel opstellen.
Een tekst veld heeft immers andere regels dan een e-mail veld of een datum veld.
Uiteraard kun je dit ook via javascript regelen.

Ik zou dit laatste zeker doen.
Alleen niet alleen.
De grootste fout die iemand kan maken, is dat de invoer die vanuit het Internet komt, vertrouwd wordt.

Kijk je naar het totale script, zul je zien dat er geen opschoning van ingevoerde data plaats vindt.
Voor dit artikel heb ik gekozen dat hier niet te doen.
Het zou de uitleg onnodig complex maken.
In een toekomstig artikel kom ik hier nog op terug.


Een voorbeeld van een functie.


Als voorbeeld laat ik hier het afhandelen van een datum zien.
de datum komen namenlijk altijd in een ander formaat in de databse dan ze op een website leesbaar zijn.
De database verwacht 2012-12-07
En de website verwacht 07-12-2012
We zullen dus van leesbaar naar niet leesbaar moeten gaan.


  Een voorbeeld van een functie  

	if ( !strlen($_POST['geb_datum']) )	
	{ 
		$geb_datum = "0000-00-00" ;
	}
	else
	{
		$geb_datum = format_datum_1($_POST['geb_datum']) ;
	}



eerst wordt er gekeken of er een invoer is, zo nee dan is de datum 000-00-00
Is er wel een invoer, dient deze omgezet te worden.
Hier is de functie

 format_datum_1()  
voor.
De functie staat in de file
 functies.php 
welke in het begin van het script aangeroepen werd met de
 include() 
functie.
.


Het afhandelen van de fouten routine


Hiervoor dient het volgende stuk script.


  foutenlijst afhandeling  

    // fouten controle.
    // en zo niet.
    if (sizeof($foutenlijst) == 0)
    {

        //     de daadwerkelijk toevoeg routine

    }
    else
    {        
        // er zijn fouten gevonden.
        // laat deze als lijst zien.
        echo 'De volgende fouten traden op :'."\n";
        
		echo '
    '."\n"; for ($x=0; $x'.$foutenlijst[$x].''."\n"; } echo '
'."\n"; echo '
'."\n"; }

Als er fout optreedt, weet je dat de array $foutenlijst gevuld is.
Dus als de array aanwezig is, ( lees niet leeg is ), zijn er fouten.
De eerste regel kijkt hier naar.
Deze bepaalt naar welke lus er door gestuurd wordt.
Het daadwerkelijk toevoegen of het laten zien van fouten.

Is er een fout, wordt de gehele array $foutenlijst uitgelezen.
Aangezien er alleen maar fouten in kunnen staan, mag alles getoond worden.

Het is trouwens wel zo vriendelijk om hier een link in te bouwen om terug te keren in het script.
Je geeft iemand zowel de gelegenheid een formulier te verbeteren.


Try Catch

Het werkende gedeelte.

  try - catch  


		try
		{
			// Verzorg connectie naar MySQL
			$db_n = new PDO('mysql:host=localhost;dbname='.$database, $gebruiker, $wachtwoord);
			
			$db_n->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

			
			// Het opzetten en uitvoeren van de vraagstelling					   
			$st_n = $db_n->prepare("INSERT INTO ".$tabel."
									   ( mv,
										voorletters,
										voornaam,
										tussenvoegsel,
										naam,
										straat,
										nummer,
										pc,
										woonplaats,
										telefoon,
										email,
										geb_datum,
										opm )
							  VALUES( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) 
							  ") ;
									 
			$st_n->execute( array( $_POST['mv'], 
									$_POST['voorletters'], 
									$_POST['voornaam'], 
									$_POST['tussenvoegsel'], 
									$_POST['naam'], 
									$_POST['straat'], 
									$_POST['nummer'], 
									$_POST['pc'], 
									$_POST['woonplaats'], 
									$_POST['telefoon'], 
									$_POST['email'],  									
									$geb_datum, 
									$_POST['opm'] ) 	
								) ;
					
					
			//-----redirect dmv javascript
			echo '<script type="text/javascript">     '."\n" ;
			echo '<!--                                '."\n" ;
			echo '	window.location = "index.php"     '."\n" ;
			echo '//-->                               '."\n" ;
			echo '</script>                           '."\n" ;
			//-----/redirect dmv javascript	
		}
		catch(PDOException $e)
		{
			echo '<pre>'."\n" ; 
			echo '<table cellspacing=0 cellpadding=0 border=0>';
			echo '<tr><td> Regel: </td><td>'.$e->getLine().'</td></tr>'."\n" ; 
			echo '<tr><td> Bestand:  </td><td>'.$e->getFile().'</td></tr>'."\n" ; 
			echo '<tr><td> Foutmelding: </td><td>'.$e->getMessage().' </td></tr>'."\n" ; 
			echo '</table>'."\n" ; 
			echo '</pre>'."\n" ; 
		}


Voor een groot gedeelte is dit in het vorige artikel al uitgelegd.
(Het begin van een applicatie)


Het enige wat hier bij komt, is het vormen van de query.

Deze is goed leesbaar.


De prepared statements bieden je de mogelijkheid tot het creeren van queries die veiliger zijn, waarvan de performance beter is en die relatief eenvoudig te noteren zijn.
Dit veiliger slaat op het feit dat er PHP via de bindParam methode automatisch variabelen beveilgd worden.

MySQL exploits kunnen zo niet gebeuren.
Omdat het queryplan wordt opgesteld voordat er data wordt doorgegeven, is de query ook niet meer gevoelig voor "SQL injection".
De structuur van de query wordt vastgelegd tijdens het prepareren van het statement en kan daarna niet meer veranderen.
De data waarmee het statement later wordt aangeroepen kan dus de structuur van de query niet meer veranderen, het wordt simpelweg als data behandeld en niet als SQL statements.

Bron: http://wiki.phpfreakz.nl/PreparedStatements

Er kan enige verwarring optreden bij deze zin

$st_n = $db_n->prepare("INSERT INTO ".$tabel."

Er komt ineens de variabele

 $st_n 
om de hoek kijken.
De basis is echter de array
 $db_n 
Deze is nodig om een connectie met MySQL te maken en te onderhouden.
De array
 $st_n  
gebruik je om de queries verder af te handelen


De volgende artikelen

De volgende artikelen zullen gaan over :
  • Het veranderen van gegevens
  • Het zoeken van gegevens
  • En het verwijderen van gegevens

Hierbij wordt gebruik gemaakt van bovenstaande files.

Deze zijn trouwens in de DOWNLOAD sectie te vinden
onder de naam adressen_pdo.zip.

Veel programmeer plezier ermee.


Tot ziens,

Ubel Jan van Wijhe
van Wijhe Consultancy