MySQL Foutafhandeling In PHP
Inhoud
Waarom foutafhandeling?
Er zijn twee redenen.
- Het is de enige manier om te achterhalen waarom een query faalt.
Zonder foutafhandeling is het zo goed als onmogelijk om te achterhalen welke query faalt en waarom.
- Het is de enige manier om in je script te laten herkennen dat een query faalt.
Dat een query faalt is al erg genoeg maar als daardoor je script in een onmogelijke situatie komt kan dat zeer ernstige gevolgen hebben. Denk aan een overboeking tussen banken, waarbij het afboeken van rekening A wel lukt, maar hij bijschrijven op rekening B mislukt. In dat geval wil je absoluut weten dat het mislukt, zodat jet het geld terug kunt schrijven naar rekening A.
(geen) meldingen
Standaard zal PHP, afhankelijk van de soort fout en serverinstellingen, geen foutmeldingen laten zien of juist een botte melding naar het scherm dumpen als er iets mis gaat met een SQL query. Daarom is het verstandig om deze foutafhandeling zelf te schrijven zodat je makkelijk kunt zien wat er mis gaat met je queries.
Een voorbeeldje van PHP code die informatie uit een tabel leest zie je hieronder:
| 1 2 3 4 5 6 7 | <?php
$rResult = mysql_query("SELECT * FROM tabel WHERE iets=true");
while($aRow = mysql_fetch_assoc($rResult))
{
echo $aRow['kolom'];
}
?> |
Het kan prima gebeuren dat je query die je aan mysql_query meegeeft een fout oplevert. mysql_query zal je dit echter niet vertellen. Pas bij mysql_fetch_assoc krijg je hierover een foutmelding.
Warning: mysql_fetch_assoc():supplied argument is not a valid MySQL result resource in ...
Dit komt omdat in $rResult geen MySQL resource zit, maar een boolean false. Het is daarom belangrijk dat je controleert of de query gelukt is.
Foutafhandeling
Er zijn meerderen manieren om fouten af te handelen. Elke soort fout en elke omstandigheid waaronder hij voor kan komen vraagt om een andere aanpak.
Het komt er in alle manieren op neer dat je controleert of de query gelukt is. Als de query niet gelukt is dan sla je die delen van je script over die van die query gebruik maken. Als je een query om een gebruiker op te halen mislukt dan kun je niets doen dat die gebruikersgegevens nodig heeft.
GEEN OR DIE!
Vergeet het bestaan van 'or die()'. Alsjeblieft. Het is absolute onzin om je script te stoppen nadat er een query is mislukt. Sterker, als een query mislukt dan wil je vrijwel altijd juist een ander stuk code starten om die fout op te vangen of om andere data te proberen.
Als je script gewoon stopt dan ziet de bezoeker met een halve pagina waar hij niets meer mee kan, en dat wil je natuurlijk absoluut niet.
Simpel
Als de query mislukt dan geeft mysql_query() de waarde FALSE terug, en daar moet je dus op controleren.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?php
$sSQL = "SELECT * FROM tabel WHERE kolom = 'waarde'";
$rResult = mysql_query($sSQL, $rConnection);
if($rResult === false)
{
echo("Er ging iets fout met de query: ".mysql_error($rConnection)." (".$sSQL.")");
}
else
{
while($aRow = mysql_fetch_assoc($rResult))
{
echo $aRow['kolom'];
}
}
?> |
Simpel 2
Een voorbeeld van deze foutafhandeling ziet er als volgt uit:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <?php
if( $_SERVER['REMOTE_ADDR'] == 'hier jouw ip-adres' )
{
define('DEBUG_MODE', true);
}
else
{
define('DEBUG_MODE', false);
}
$sSQL = "SELECT kolom FROM tabel WHERE id = 12";
$rResult = mysql_query($sSQL, $rConnection);
if(!$rResult)
{
if(DEBUG_MODE)
{
echo("Er ging iets fout met de query: ".mysql_error($rConnection)." (".$sSQL.")");
}
else
{
echo("Er ging iets fout met de query");
}
}
else
{
while($aRow = mysql_fetch_assoc($rResult))
{
echo $aRow['id'];
}
}
?> |
Deze code zal de SQL query uitvoeren. Als dat goed gaat roept hij de while-loop aan en print de opgeleverde rijen. Mocht het mislukken, zal hij naar de echo gaan en de foutmelding op het scherm laten zien.
Omdat je niet wilt dat elke bezoeker van je website alle informatie over je database kan bekijken, kan je gebruik maken van de DEBUG_MODE constante. Als deze op false staat zal de gebruiker een simpele foutmelding krijgen, anders komt de volledige foutmelding en de query op het scherm te staan. Daardoor kan je snel debuggen en uitzoeken wat er fout ging.
Database classes
Als je databaseclasses gebruikt is het afhandelen van de meldingen eenvoudig in die class te zetten en dat spaart je weer een hoop tikwerk.
Exceptions Try, Throw & Catch
Nog mooier dan de IF/ELSE opstelling is PHP5's Throw/Catch methode. Hiermee kun je in de method die query laten bepalen dat er een exception moet worden geworpen wanneer de query mislukt. Door de queries in een Try() blok te laten uitvoeren kun je er dan extreem eenvoudig voor zorgen dat alle code die van die query afhing wordt overgeslagen.
@todo: voorbeeld maken.
Overkoepelende artikelen:
