PHP en MySQLeen goed team

Het opzetten van een applicatie

Voor het opzetten van een applicatie binnen PHP & MySQl, gaan we een tweetal programma's voor gebruiken.

Het volgende artikel maakt gebruik van PHPMyAdmin en een PHP editor.
Dit artikel gaat ervan uit dat je de volgende artikels gelezen hebt

PHPMyadmin

Het pakket is in het vorige artikel besproken.
Hij is te vinden op :
http://phpmyadmin.sourceforge.net/download.html

PHP editor

Ik gebruik hiervoor Notepad ++
Deze (of een update) is te vinden op:

http://notepad-plus-plus.org/

Installeer het pakket en maak een snelkoppeling op je bureaublad.

Het volledige script.

Het eerst laat ik jullie het volledige script zien, waarna de uitleg per gedeelte volgt.

Allereerst het volledige script.

  Het volledige script  
try
{	
	//-----Verzorgt de connectie naar MySQL
	$db = new PDO('mysql:host=localhost;dbname='.$database, $gebruiker, $wachtwoord);
	
	$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	

	//-----Nodig voor weergeven geen resultaat	
	$resultaat = '' ;
	
	//-----Het opzetten en uitvoeren van de vraagstelling
	$st = $db->prepare("SELECT * from ".$tabel." ORDER BY naam ASC ");
	$st->execute( array() );
	

	//-----Begin tabel met de werkelijke informatie
	echo '<table cellpadding="5" cellspacing="5" border="0">'."\n" ;
	
		
	//-----Vanuit array $resultaat het toewijzen van variabelen aan de sub array $rij	
	foreach ( $st->fetchAll() as $rij )
	{	
		//-----
		echo '<tr>'."\n" ;
		echo '<td>' ;
		echo '<a href="wijzig.php?id='.$rij['id'].'">' ;
		echo $rij['mv'].' ' ;
		echo $rij['voorletters'].' ' ;
		if ( $rij['tussenvoegsel'] )
		{
			echo $rij['tussenvoegsel'].' ' ;		
		}
		echo $rij['naam'] ;
		echo '</a>' ;
		echo '</td>'."\n" ;
		echo '<td>'.$rij['straat'].' '.$rij['nummer'].'</td>'."\n" ;
		echo '<td>'.$rij['pc'].'</td>'."\n" ;
		echo '<td>'.$rij['woonplaats'].'</td>'."\n" ;
		echo '<td>'.$rij['telefoon'].'</td>'."\n" ;
		echo '<td>'.$rij['email'].'</td>'."\n" ;
		echo '<td>'.format_datum_2($rij['geb_datum']).'</td>'."\n" ;		
		echo '<td><a href="verwijder.php?id='.$rij['id'].'&naam='.$rij['naam'].'">' ;
		echo '<img src="./afbeeldingen/verwijder.png" width="22" border="0" alt="Verwijder adres" /></a>';
		echo '</td>'."\n" ;
		echo '</tr>'."\n" ;
		
		//-----Toewijzen van de variabele $resultaat als er records aanwezig zijn
		$resultaat = '1' ;		
		//-----/
	   }	
		
	echo '</table>'."\n" ;	

	//-----Laat dit zien als er geen records zijn	
	if ( $resultaat != '1' )
	{
		//-----
		echo '<table cellspacing="5" cellpadding="5" border="0">'."\n" ;
		echo '<tr>'."\n" ;
		echo '<td valign="top" colspan=2> Er is niemand gevonden </td>'."\n" ;
		echo '</tr>'."\n" ;
		echo '</table>'."\n" ;	
		
		$resultaat = "" ;
		//-----/
	}
	//-----/		
}
catch(PDOException $e)
{
	//-----
    echo '<pre>'."\n" ;
    echo '<table cellspacing=0 cellpadding=0 border=0>' ;
    echo '<tr><td>   File:    </td><td>   ".$e->getFile()."   </td></tr>'."\n" ;
    $foutmelding = $st->errorInfo() ;
	echo '<tr><td>   Code melding:    </td><td>   ".$foutmelding[1]."   </td></tr>'."\n" ;		
	echo '<tr><td colspan=2>   </td></tr>'."\n" ;		
	echo '<tr><td colspan=2>   Neem aub. contact met de beheerder van deze website op,</td></tr>'."\n" ;	
	echo '<tr><td colspan=2>   met vermelding van de naam van de file en de code melding.</td></tr>'."\n" ;	
	echo '</table>'."\n" ;	
    echo '</pre>'."\n" ;
	//-----/
}
//-----/

De uitleg

 

Try Catch

Dit mechanisme is nieuw in PHP5.

Het zorgt ervoor dat je een fouten afhandelingsroutine voor het uitlezen van de MySQL database zelf kunt ontwerpen.

  try catch  
try
{    

	/*
	Hier het formuleren en weergeven van de vraag aan de database
	*/

}
catch (PDOException $e)
{

	/*
	Hier het weergeven van eventuele fouten    
	*/

}



Ziet er simpel uit zou je zeggen.
De try probbert de query uit te voeren.
Zit er een fout in de query, treedt het catch mechanisme in werking.
Let wel alleen het kunnen uitvoeren van de query wordt getest, niet de resulaten van de query.

PDO

PDO is een database onhafhankelijke Data Access Abstract Layer.
Dat betekend dat je PDO kan gebruiken voor verschillende database types.

Hier gebruik ik als database type MySQL,

  pdo  
	$db = new PDO('mysql:host=localhost;dbname=adressen', 'gebruiker', 'wachtwoord') ;

	$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

	$st = $db->prepare(" SELECT * FROM adressen ORDER BY naam ;") ;

	$st->execute( );



De opbouw van PDO is altijd hetzelfde.

Je geeft aan

  • het type database ( mysql )
  • de host ( localhost)
  • de database ( adressen )
  • inlognaam ( gebruiker )
  • wachtwoord ( wachtwoord )

Met het woord  new  geef je dat PDO een nieuw object dient te gaan maken.
Waarvan alle eigenschappen toegankelijk zijn via  $db 

 db new PDO  
	$db = new PDO('mysql:host=localhost;dbname=adressen', 'gebruiker', 'wachtwoord') ;



Om van de foutmeldingen gebruik te kunnen maken, wordt in de tweede regel de fouten routine eigenschappen gedefineerd.

  setAttribute  
	$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);



Voor een nadere uitleg ziervoor op http://nl.php.net/manual/en/pdo.error-handling.php

De derde regel probeert of de query uitgevooerd kan worden.

  prepare  
	$st = $db->prepare(" SELECT * FROM adressen ORDER BY naam ;") ;



Ontstaat er ergens een fout, zal er nu direct naat de catch gegaan worden.
De query wordt dus niet defintief uitgevoerd.
Alleen maar gesimuleerd.

Let wel.
Er wordt alleen gekeken of de query uit te voeren is.
De syntax wordt gecheckt.
Niet of de resultaten de gewenste resultaten zijn.

Verloopt de simulatie goed zal de query daadwerkelijk uitgevoerd gaan woorden

  execute  
	$st->execute( );


De uitvoer

De uitvoer komt uit een foreach loop.

  foreach loop  
foreach ( $st->fetchAll() as $rij )
{
	/*
		Doe iets met $rij
	*/
} 



Deze eigenschap fetchAll() zorgt ervoor dat alle records opgehaald worden.
De foreach loop doet de rest.

Let wel op de notatie van de variablelen $rij [ 'straat' ]

De blokhaken en de aanhalingstekens zijn hier nodig.

  de uitvoer  
	//-----Begin tabel met de werkelijke informatie
	echo '<table cellpadding="5" cellspacing="5" border="0">'."\n" ;	
		
	//-----Vanuit array $resultaat het toewijzen van variabelen aan de sub array $rij	
	foreach ( $st->fetchAll() as $rij )
	{	
		//-----
		echo '<tr>'."\n" ;
		echo '<td>' ;
		echo '<a href="wijzig.php?id='.$rij['id'].'">' ;
		echo $rij['mv'].' ' ;
		echo $rij['voorletters'].' ' ;
		if ( $rij['tussenvoegsel'] )
		{
			echo $rij['tussenvoegsel'].' ' ;		
		}
		echo $rij['naam'] ;
		echo '</a>' ;
		echo '</td>'."\n" ;
		echo '<td>'.$rij['straat'].' '.$rij['nummer'].'</td>'."\n" ;
		echo '<td>'.$rij['pc'].'</td>'."\n" ;
		echo '<td>'.$rij['woonplaats'].'</td>'."\n" ;
		echo '<td>'.$rij['telefoon'].'</td>'."\n" ;
		echo '<td>'.$rij['email'].'</td>'."\n" ;
		echo '<td>'.format_datum_2($rij['geb_datum']).'</td>'."\n" ;		
		echo '<td><a href="verwijder.php?id='.$rij['id'].'&naam='.$rij['naam'].'">' ;
		echo '<img src="./afbeeldingen/verwijder.png" width="22" border="0" alt="Verwijder adres" /></a>';
		echo '</td>'."\n" ;
		echo '</tr>'."\n" ;
		
		//-----Toewijzen van de variabele $resultaat als er records aanwezig zijn
		$resultaat = '1' ;		
		//-----/
	}	
		
	echo '</table>'."\n" ;	
	//-----/Einde tabel met de werkelijke informatie


Catch

Het mechanisme welke voor de fouten meldingen zorgt.
Dit zal op een productie server anders er uit zien dan op een test server.
In dit gevak is er voor een minimaal bericht gekozen.

Een voorbeeld zonder een fouten afhandelings routine.

  File:     SQLSTATE[42S22]: Column not found: 1054 Unknown column 'naam2' in 'order clause'
 

Voor uitgebreidere foutmeldingen zie op http://nl.php.net/manual/en/pdo.error-handling.php

Nu het voorbeeld met onze fouten afhandelings routine.

  catch  
catch(PDOException $e)
{
	//-----
    echo '<pre>'."\n" ;
    echo '<table cellspacing=0 cellpadding=0 border=0>' ;
    echo '<tr><td> File: </td><td> ".$e->getFile()." </td></tr>'."\n" ;
    $foutmelding = $st->errorInfo() ;
	echo '<tr><td>   Code melding:    </td><td>   ".$foutmelding[1]."   </td></tr>'."\n" ;		
	echo '<tr><td colspan=2> </td></tr>'."\n" ;		
	echo '<tr><td colspan=2>  Neem aub. contact met de beheerder van deze website op,</td></tr>'."\n" ;	
	echo '<tr><td colspan=2>  met vermelding van de naam van de file en de code melding.</td></tr>'."\n" ;	
	echo '</table>'."\n" ;	
    echo '</pre>'."\n" ;
	//-----/
}


Wel of geen resultaat

Binnen de try heb ik de de variable $resultaat gedefinieerd. ( leeg gedefinieerd )

  resultaat  
	$resultaat = ""  ;



Hiermee kan ik PHP zelfs in strict mode goed laten werken.
Deze mode is het meest kritisch en laat zelfs waarschuwingen zien als het volgens hem nog beter zou kunnen.
Op de meeste productie server is deze trouwens niet zo ingesteld.

Als binnen de foreach loop er geen resultaat is, zou ik toch wat op mijn scherm willen zien.
Als er resultaat is, wordt $resultaat gevuld met 1 ( meerdere malen zelfs )
Als er na de foreach loop geen $resultaat is,

  resultaat  
	//-----Laat dit zien als er geen records zijn	
	if ( $resultaat != '1' )
	{
		/*
			een actie volgt.
		*/
	}


Komt er een bericht
Er is niemand gevonden.

  Er is niemand gevonden.  
	//-----Laat dit zien als er geen records zijn	
	if ( $resultaat != '1' )
	{
		//-----
		echo '<table cellspacing="5" cellpadding="5" border="0">'."\n" ;
		echo '<tr>'."\n" ;
		echo '<td valign="top" colspan=2> Er is niemand gevonden </td>'."\n" ;
		echo '</tr>'."\n" ;
		echo '</table>'."\n" ;	
		
		$resultaat = "" ;
		//-----/
	}
	//-----/



Bovenstaande script is te vinden onder de naam adressen_pdo.zip

De volgende artikelen

De volgende artikelen zullen gaan over :

  • Het toevoegen van gegevens
  • Het veranderen van gegevens
  • En het verwijderen van gegevens
  • Het zoeken van gegevens


Veel programmeer plezier ermee.


Tot ziens,

Ubel Jan van Wijhe
van Wijhe Consultancy
E-mail naarinfo@vanwijheweb.nl