§ 5 PHP en databases
5.1 Het benaderen van een datbasemet PHP en MySQL
In deze module concentreren we ons vooral op het gegevens uit een database te halen en die in een webpagina te tonen en gegevens in een database op te slaan. PHP is in staat om (My)SQL bewerkingen door te voeren op een relationeel database managementsysteem (DBMS), maar we zullen ons alleen maar toeleggen op de SELECT, INSERT en UPDATE bewerkingen.
Het aanmaken van een database met tabellen met behulp van phpMyAdmin kun je vinden in bijlage XXX
Het halen van gegevens uit een database met behulp van PHP verloopt in 4 stappen:
- Maak contact met de database server via Database Management Services
- Kies op de server de juiste database
- Voer de query uit en geef de resultaten weer in een webpagina
- Verbreek de verbinding met de databaseserver
PHP heeft voor elk DBMS een set database functies waarmee het kan werken.
In ons geval kijken we alleen maar naar het MySQL server.
5.2 De functie mysql_connect()
Format:
$verbinding = mysql_connect($hostnaam,$gebruikersnaam,$wachtwoord);
Werking: maak een verbinding met het MySQL DBMS dat op de computer draait met de naam hostnaam waarbij je de vereiste gebruikersnaam en wachtwoord ingeeft.
De functie zorgt ervoor dat een foutmelding in beeld gebracht wordt als er om een of andere reden geen verbinding met het DBMS tot stand gebracht kan worden. Dat kan in de trant van: verkeerd wachtwoord, verkeerde gebruikersnaam, DBMS is niet op die computer aangetroffen.
We gaan ervan uit dat XAMPP of lokaal op de machines is geïnstalleerd of via het netwerk bereikbaar is. Daarin zit phpMyAdmin als DBMS. Je kunt hiermee werken door op de adresbalk van je browser in te typen:
localhost/phpmyadmin.
Voor de voorbeelden in deze module gebruiken we de volgende gegevens:
Host: localhost Gebruikersnaam: root Wachtwoord: ""
De verbinding met het DBMS ziet er dan als volgt uit:
$verbinding = mysql_connect("localhost","root","");Dit is in feite een erg onveilige situatie. Je moet eigenlijk nooit als gebruiker root een database benaderen. Bovendien is er hier geen wachtwoord ingesteld waardoor het voor hackers wel erg eenvoudig wordt om je database te benaderen. We hebben deze situatie gekozen omdat het een eenvoudige manier is om mee te werken. Zorg er dus in alle gevallen voor dat je bij het maken van websites die gebruik maken van een database wel goed beveiligd zijn.
5.3 De functie mysql_select_db()
Format:
$db = mysql_select_db("database");
Werking: selecteert een specifieke database die gehost is door het DBMS.
In onze voorbeelden zullen we gebruik maken van de database enigma_php. Dat betekent dat we de database kunnen selecteren door de code:
$db = mysql_select_db("enigma_php");
Onze database enigma bevat de tabel landen met verschillende gegevens
land_id | land | hoofdstad | werelddeel | inwoners |
1 | Frankrijk | Parijs | Europa | 59000000 |
2 | Ierland | Dublin | Europa | 3660000 |
3 | Griekenland | Athene | Europa | 10700000 |
4 | Verenigde Staten | Washington | Noord Amerika | 281000000 |
5 | Japan | Tokio | Azië | 130000000 |
6 | Zuid Afrika | Pretoria | Afrika | 43800000 |
7 | Marokko | Rabat | Afrika | 31200000 |
8 | China | Bejing | Azië | 1200000000 |
5.4 De functie mysql_query()
Format:
$resultaat = mysql_query($query);
Werking: zendt de SQL query naar de database.
De functie stuurt een PHP resultaat object terug dat alle rijen van een tabel uit een database bevat die de uitkomst vormen van de opgegeven query.
We kunnen nu een volgende SELECT query maken:
$query = "SELECT * FROM landen ORDER BY inwoners"; $resultaat = mysql_query($query);
5.5 De functie mysql_fetch_array()
Format:
$row = mysql_fetch_array($resultaat);
haalt de volgende rij uit het object resultaat. Geeft als terugkeerwaarde false als er geen nieuwe rijen meer zijn. Normaal wordt deze functie gebruikt in een while loop:
while ($row = mysql_fetch_array($resultaat) ) { doe iets met die rij; }
Elke kolom van een rij wordt benaderd met een array notatie:
De eerste kolom is row[id]De tweede kolom is row[1]
Etc.
Om nu de eerste kolom van alle rijen van de uitkomst van een query in beeld te brengen gebruik je de volgende code:
while ($row = mysql_fetch_array($resultaat)) { print($row["land_id"]. "
\n"); }
Nu zullen we al het voorafgaande eens in een compleet voorbeeld laten zien: selecteer alles uit de databasetabel landen en toon dat als een tabel op het scherm gesorteerd op werelddeel.
De code hiervoor is:
<html> <head> <title>Lijst van alle landen uit de tabel</title> </head> <body> <h2>Lijst van alle landen per werelddeel</h2> <table border="1" cellpadding="2"> <tr> <th>land_id</strong></th> <th>land</strong></th> <th>hoofdstad</strong></th> <th>werelddeel</strong></th> <th>inwoners</strong></th> </tr> <?php mysql_connect("localhost","root",""); mysql_select_db("enigma_php"); $query = "SELECT * FROM landen ORDER BY werelddeel"; $resultaat = mysql_query($query); while ($row = mysql_fetch_array($resultaat)) { ?> <tr> <td><?php print($row["land_id"]); ?></td> <td><?php print($row["land"]); ?></td> <td><?php print($row["hoofdstad"]); ?></td> <td><?php print($row["werelddeel"]); ?></td> <td><?php print($row["inwoners"]); ?></td> </tr> <?php } ?> </table> </body> </html>
Als de code goed is ingevoerd krijg je iets te zien dat hier op lijkt:

We kunnen de select query naar believen aanpassen om de gebruiker te laten bepalen wat voor informatie hij wil zien.
Normaal wordt dat gedaan door een HTTP variabele naar het script te sturen die dan als onderdeel van de query kan worden gebruikt.
Laten we het vorige script eens aanpassen:
Zorg ervoor dat er een HTTP variabele $werelddeel als input komt (bijvoorbeeld uit een webformulier)
Gebruik deze variabele om alleen maar de landen te selecteren uit dat specifieke werelddeel
SELECT * FROM landen WHERE werelddeel = \"$werelddeel\";
Als de waarde uit het invoerveld Europa is, wordt de query
SELECT * FROM landen WHERE werelddeel = \"Europa\";
De eenvoudigste manier om dit script te runnen is door gebruik te maken van de HTTP GET-methode om de variabele $werelddeel aan te bieden, waardoor het mogelijk wordt om de variabele aan de URL te koppelen.
Bijvoorbeeld:
htpp://localhost/PHP-Enigma/landenperwerelddeel.php?werelddeel=Europa
Als alternatief kun je met de opgedane kennis een webformulier ontwerpen dat de variabele $werelddeel doorgeeft.
Het is echter sneller om de vereiste gegevens aan de URL toe te voegen, bijvoorbeeld:
?land=Frankrijk
Maar wees voorzichtig! Als je niet de goede code aan de URL toevoegt of een formulier dat de gegevens naar het PHP script moet sturen onjuist opzet, zal het script wel runnen maar niet in staat zijn enig resultaat als output te laten zien. Dit komt omdat de select query specifieke informatie vraagt over het werelddeel waarvan je de landen wilt laten zien.
Een algemene manier om in PHP met databases te werken is de zogenaamde tweetraps procedure:
Allereerst geef je de gebruiker een index waarmee je een samenvatting van alle items in de database te zien krijgt.
Daarna geef de gebruiker de mogelijkheid om op elk item te klikken om alle gegevens per item weer te geven.
Dit patroon zie je vaker op het web. Bij www.bol.com kun je bijvoorbeeld voor boeken kiezen van een schrijver. Je krijgt dan alle titels in beeld en elke titel heeft een link waarachter een uitgebreide informatie van die titel te vinden is.
We zullen twee scripts gaan gebruiken: het index script en het detailscript
De code van het script landenindex.php:
<html> <head> <title>Index van alle landen</title> </head> <body><h2>Index van alle landen</h2> <table border="1" cellpadding="2"> <tr> <th>id</th> <th>naam</th> </tr> <?php mysql_connect("localhost","root",""); mysql_select_db("enigma_php"); $query = "SELECT land_id, land FROM landen ORDER BY land_id"; $resultaat = mysql_query($query); while($row = mysql_fetch_array($resultaat)) { ?> <tr> <td><?php print($row["land_id"]); ?></td> <td><?php print ("<a href=\"landendetails.php?land=row["land"]\">$row["land"] </a>"; ?></td> </tr> <?php } ?> </table> </body> </html>
Het resultaat ziet er dan als volgt uit:

In het bestand landenindex.php wordt verwezen naar de code van landendetails.php. Dat bestand ziet er als volgt uit:
<?php //Gebruik de functie addslashes() om misbruik (SQL-Injection) te voorkomen. if($_GET["land"]){ $land = addslashes($_GET["land"]); } else{ $land = addslashes($_POST["land"]); } ?> <html> <head> <title>Details van <?php print($land); ?></title> </head> <body> <h2 style="color:navy"> Details van <?php print($land); ?></h2> <?php mysql_connect("localhost","root",""); mysql_select_db("enigma_php"); $query = "SELECT * FROM landen WHERE land = \"$land\""; $resultaat = mysql_query($query); while($row = mysql_fetch_array($resultaat)) { ?> <p>Landnummer: <b><?php print($row["land_id"]); ?></b></p> <p>Hoofdstad: <b><?php print($row["hoofdstad"]); ?></b></p> <p>Werelddeel: <b><?php print($row["werelddeel"]); ?></b></p> <p>Inwoners: <b><?php print($row["inwoners"]); ?></b></p> <?php } ?> </body> </html>
Klik vervolgens op de link Japan. Dan krijg je het volgende in beeld:

Let op hoe de URL op de adresbalk er uitziet! Merk bovendien op dat aan het begin van het script de waarde van het gekozen land wordt opgehaald via de GET-methode of de POST-methode. Het is handig om dat op deze wijze te doen. Mocht de GET-methode niet werken heb je altijd nog de POST-methode achter de hand.