Succesvol debuggen in PHP
Omdat ik op verschillende fora vaak dezelfde vragen zie terugkomen, ga ik een paar simpele tips geven om je probleem zelf op te lossen.
error_reporting(E_ALL)
Bij het debuggen is het belangrijk dat je error_reporting op E_ALL zet zodat je elke foutmelding te zien krijgt. Vaak werkt iets niet zoals verwacht omdat er één of andere fout wordt onderdrukt. Op de "live" versie van je script
error_reporting() wel uitschakelen
Niet panikeren
Als iets niet werkt zoals je verwacht of je krijgt een foutmelding. Het belangrijkste is dat je niet gaat panikeren. 80% van alle foutmeldingen hebben een typfout als oorzaak.
Veel voorkomende foutmeldingen
Citaat:Parse error: syntax error, unexpected T_PRINT in /www/sandbox/debug/index.php on line 3
Als je deze foutmelding te zien krijgt, ben je waarschijnlijk iets vergeten of heb je iets teveel getypt. De groene tekst kan wel wat variëren, maar het is vaak een haakje of punt-komma vergeten. Kijk of de aangegeven lijn correct is afgesloten. Als dat zo is, kijk dan naar de haakjes op de aangegeven lijn.
Citaat:Fatal error: Call to undefined function ik_besta_niet() in /www/sandbox/debug/index.php on line 2
Heel simpel, de functie bestaat niet. Als je een functie wil gebruiken van één of andere PHP modules (bvb, de GD Library) kan je testen of de de functie bestaat met
function_exists(). Als je deze foutmelding krijgt als je een functie wil aanroepen die in een bestand staat die je include zal waarschijnlijk de include fout zijn maar dan krijg je normaal de volgende foutmelding.
Citaat:Fatal error: Cannot redeclare ik_besta_al() (previously declared in /www/sandbox/debug/index.php:5) in /www/sandbox/debug/index.php on line 10
Een beetje in lijn met de vorige foutmelding. Dit keer is de functie al eens gedeclareerd. Dit gebeurd vaak door het twee keer includen van hetzelfde bestand.
Citaat:Warning: include(ik_besta_niet.php) [function.include]: failed to open stream: No such file or directory in /www/sandbox/debug/index.php on line 2
Warning: include() [function.include]: Failed opening 'ik_besta_niet.php' for inclusion (include_path='.:/usr/share/php5:/usr/share/php') in /www/sandbox/debug/index.php on line 2
Controleer of het bestand bestaat en kijk of je geen typfout gemaakt heb bij de include.
MySQL problemen en foutmeldingen
Citaat:Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'foo'@'localhost' (using password: YES) in /www/sandbox/debug/index.php on line 2
PHP kan niet verbinden met de MySQL server met de opgegeven gegevens. Controleer of alle gegevens kloppen, anders zal je even je provider moeten contacteren.
Alles wat te maken heeft met queries kan je makkelijk debuggen door
mysql_error(). Of wel op de volgende manier:
PHP-code:
$query = mysql_query("SELECT * FROM tabel") or die(mysql_error());
Ofwel zo:
PHP-code:
$query = mysql_query("SELECT * FROM tabel");
if(($errmsg = mysql_error())!="")
{
die($errmsg);
// of een andere foutafhandeling.
}
var_dump() is je vriend
Ik zie vaak dat mensen een simpele if-constructie toepassen om te testen of iets werkt of niet. Er is echter een simpelere manier om dit te doen, namelijk de
var_dump() functie. Met var_dump() kan je alles dumpen, zowel booleans, als arrays, als objecten. Als je de pagina gaat laden, ga je zien dat alles achter mekaar komt te staan en dat het niet echt duidelijk is. Je kan ofwel de broncode opvragen van de pagina of je de html pre-tags gebruiken om een betere opmaak te verkrijgen:
PHP-code:
print("<pre>");
var_dump($var);
print("</pre>");
backtrace
Als je echt een gecompliceerde bug hebt, kan je het hele verloop van je script bekijken door
debug_backtrace() te gebruiken. Dit zal je een array geven waar duidelijk instaat welke functies je script heeft doorlopen, met welke argumenten enzovoort. PHP5 ook de functie
debug_print_backtrace() die meteen de backtrace afdrukt. Zo'n backtrace is erg handig als andere mensen je script of applicatie gebruiken. Je kan het zo inbouwen dat ze meteen een mail kunnen sturen met de backtrace erin.
Taking debugging a step further
Je kan nog een stapje verder gaan in het debuggen van je code door de
xdebug extensie te installeren. Check de
documentatie voor meer informatie. De xdebug library kan je ook inbouwen in verschillende IDEs zoals
phpDesigner en het platform onafhankelijke
PHPEclipse