In dit artikel ga ik een makkelijke manier uitleggen om zelf je script te debuggen.
Stel je hebt een script geschreven en je draait je script en je krijgt niet het gewenste effect,
dan is het handig om zelf te kunnen debuggen.
Als het na het debuggen je er nog niet uit bent gekomen, dan kun je natuurlijk altijd nog hulp vragen op tbforum.
Alleen zul je nu veel gedetailleerder informatie kunnen geven waardoor het makkelijker wordt om je te helpen.
Verschillende voorkomenende fouten
Er zijn veel verschillende voorkomende fouten, sommige spreken voor zich en voor anderen zul je misschien diep in je script moeten duiken.
Ik zal hier de volgende veel voorkomende fouten behandelen:
- sql fouten
- parser en fatal fouten
- fouten die geen error geven, maar toch doet het script niet wat je verwacht
Als eerst de sql fouten
Als je in je script gebruik maakt van mysql of een andere database dan komt het wel eens voor dat er geen data wordt opgehaald.
Hier kunnen natuurlijk verschillende oorzaken van zijn.
Ik zal hier de mysql database behandelen, voor andere databases kun je wel soortgelijke manieren toepassen.
Om te zorgen dat je tijdens het maken van je script deze fouten makkelijker kunt vinden is om de mysql_error() functie te gebruiken.
Voorbeeld:
<?php
$query = mysql_query("SELECT * ROM tabelnaam")or die(mysql_error());
?>
Wat hier gebeurt is, er wordt geprobeerd om de query uit te voeren als die misgaat dan treedt de die(mysql_error()) op.
Hierna zal het script meteen gestopt worden en krijg je een error te zien.
Vaak is deze error duidelijk, soms heb je ook wat minder duidelijke foutmeldingen.
In dit voorbeeld krijgen we de volgende error:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ROM test' at line 1
Nu gaan we dit stukje 'ROM test' opzoeken in de query en komen er achter dat ROM FROM had moeten zijn.
Zonder het stukje 'or die(mysql_error())' had er, afhankelijk van de server instellingen, misschien geen fout gekomen.
Nu een ander voorbeeld:
<?php
$sql = "SELECT * FROM tabelnaam WHERE id = ".$_GET['id'];
$query = mysql_query($sql)or die(mysql_error());
?>
We gaan naar ons script 'http://www.domein.nl/script.php?id=' en hebben geen id ingevuld, vervolgens krijgen we deze error:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
Nu gaan we in de query kijken en denken: "Er is toch niets mis met deze query?". Nu is het handig om de sql code te echo-en.
<?php
$sql = "SELECT * FROM tabelnaam WHERE id = ".$_GET['id'];
die($sql);
$query = mysql_query($sql)or die(mysql_error());
?>
Vervolgens zien we op ons scherm staan:
SELECT * FROM test WHERE id =
En zien dat er geen id is ingevuld, waar we wel een id hadden verwacht!
Blijkbaar is dus onze $_GET['id'] leeg.
Nu gaan we kijken hoe we aan deze $_GET['id'] komen en zien dat dit in de url wordt ingevuld.
En jahoor! We zijn vergeten een id in te vullen.
Parser en Fatal fouten
Dit zijn fouten die ontstaan zijn doordat er ergens niet volgens de syntax van php is gewerkt.
Of er bijvoorbeeld functies zijn gebruikt die niet bestaan.
Een parser voorbeeld:
<?php
echo 'blaat'
echo 'hallo daar';
?>
Daarbij krijgen we deze error:
Parse error: parse error, expecting `','' or `';'' in /hier/path/naar/script on line 5
Nu gaan we kijken op line 5 en zien daar helemaal niets fouts staan.
Er moet dus boven deze regel iets fout zijn en de foutmelding zei het al, er mist een ';' op regel 3
Een fatal voorbeeld:
<?php
functiondienietbestaat();
?>
De foutmelding die we krijgen:
Fatal error: Call to undefined function functiondienietbestaat() in C:\wamp\www\test\debug.php on line 3
Als we op regel 3 kijken zien we dat er een functie staat die nergens is gedefiniërd.
Dit soort fouten komen meestal doordat er een include ergens mis gaat of gewoon omdat je vergeten bent de funtie te definiëren.
Ga bij dit soort fouten dus op zoek of je wel ergens de functie hebt included of gedefiniërd.
Fouten zonder error
Het gebeurt wel eens dat je iets hebt gescript en dat het dan niet werkt.
Dit noem ik fouten die geen error geven. Ook wel logische fouten genoemd.
Je hebt bijvoorbeeld een if else structuur op de volgende manier:
<?php
$standaardvalue = 'iets om in te vergelijken.';
if($_SERVER['REQUEST_METHOD'] === 'POST')
{
if($_POST['test'] == $standaardvalue)
{
echo 'Post[\'test\'] = '.$_POST['test'];
}
}
?>
Als je nu een formulier zou versturen met als method="post" en het veldje met name="test" is ingevuld, dan zou je verwachten dat dat echo statement werd gedraaid.
In dit geval zal dat ook wel gebeuren, maar soms dan gebeurt er niet wat jij verwacht en dat kun je dan zo oplossen:
Eerst gaan we op plaatsen waar we verwachten een die() functie neerzetten om te kijken of dat deel bereikt wordt.
<?php
$standaardvalue = 'iets om in te vergelijken.';
if($_SERVER['REQUEST_METHOD'] === 'POST')
{
die('request_method wordt bereikt.');
if($_POST['test'] == $standaardvalue)
{
die('post_test bevat informatie');
echo 'Post[\'test\'] = '.$_POST['test'];
}
}
?>
Als we dan die eerste die() tekst te zien krijgen halen we die weg.
<?php
$standaardvalue = 'iets om in te vergelijken.';
if($_SERVER['REQUEST_METHOD'] === 'POST')
{
Stel we krijgen nu niet op ons scherm "post_test bevat informatie", dan moeten we gaan kijken wat er dan mis is.
Nu gaan we alle variabelen die nodig zijn om die tekst te echoën op het scherm printen om te zien wat ze bevatten.
Dan krijgen alle POST variabelen te zien en $standaardvalue, en kunnen we zien of $_POST['test'] dus hetzelfde is als $standaardvalue.
Vervolgens moet je op zoek gaan waarom het niet gelijk is aan elkaar, misschien doordat je ergens een functie gebruikt die je POST data verandert o.i.d.
Er zijn duizenden mogelijkheden waardoor iets niet gaat zoals jij het verwacht en die kan ik hier natuurlijk niet allemaal neerzetten, want die weet ik niet. Zorg er altijd voor dat je de variabelen op het scherm print om te zien of ze de waarden bevatten die jij denkt dat ze hebben.
Nu hebben jullie een klein beginnetje gemaakt met het leren debuggen.
Waarschijnlijk zijn er mensen met andere manieren, maar dit is een makkelijk begin om zelf te debuggen.
Als er fouten in staan hoor ik dat graag, als er aanvullingen zijn hoor ik dat ook graag.