Tutorials
Debuggen
Uitleg over debugging, meest voorkomende fouten en hoe je deze makkelijk kunt opsporen
Pagina 1
Netjes en overzichtelijk programmeren
Regel één van debuggen is zorgen dat PHP alle foutmeldingen weergeeft. PHP geeft standaard maar een paar foutmeldingen, wanneer het echt fout gaat. Het is handig wanneer je wil debuggen te weten wanneer iets wel of niet goed gaat: zet daarom bij het coden altijd bovenaan het script:
<?
error_reporting(E_ALL);
?>
Zo geeft php netjes de foutmeldingen die het zou moeten geven.
Om een script te debuggen moet je ook netjes en overzichtelijk programmeren. Wanneer je alles door elkaar heen typt, wordt het uiteraard een onoverzichtelijke bende. Gebruik daarom altijd comment tags, en maak gebruik van inspringingen d.m.v. tabs. Wanneer je net begint met het programmeren van PHP scripts, zul je omdat het al lastig genoeg is, hier niet veel aandacht aan geven. Maar geloof me, juist wanneer je begint met PHP is dit juist zo handig omdat je dan de meeste fouten maakt en d.m.v. het netjes en overzichtelijk programmeren er sneller uit zult komen.
Zoiets zou perfect wezen, let hier vooral op de inspringingen:
<?
//-- database connectie maken
$dbhost = "localhost";
$dbuser = "username";
$dbpass = "password";
$dbname = "databasename";
//-- haal gegevens op uit db
$sql = "SELECT id FROM tabel_naam WHERE veld = 'foo'";
$res = mysql_query($sql);
//-- kijk of er wat in de database zit
if (mysql_num_rows($res) >= 1)
{
//-- loop door de array met resultaten
while ($row = mysql_fetch_array($res))
{
//-- toon de resultaten
echo "id nummer: $row[id]<br />";
}
}
//-- toon dit wanneer er niets in de array zit
else
echo "Er is geen resultaat";
//-- maak loop t/m 10
for ($i == 1; $i <= 10; $i++)
{
//-- toon $i
echo "i: $i<br />";
}
//-- bekijk of var foo is en of foo var is
if ($var == 'foo' && $foo == 'var')
{
//-- zo ja, toon dit
echo "blaat<br />";
}
//-- als de statement false is toon dit
else
{
echo "bleeh<br />";
}
?>
Het volgende is niet juist. Zoals je ziet, is het overzicht verdwenen.
<?
//-- database connectie maken
$dbhost = "localhost";
$dbuser = "username";
$dbpass = "password";
$dbname = "databasename";
//-- haal gegevens op uit db
$sql = "SELECT id FROM tabel_naam WHERE veld = 'foo'";
$res = mysql_query($sql);
//-- kijk of er wat in de database zit
if (mysql_num_rows($res) >= 1)
{
//-- loop door de array met resultaten
while ($row = mysql_fetch_array($res))
{
//-- toon de resultaten
echo "id nummer: $row[id]<br />";
}
}
//-- toon dit wanneer er niets in de array zit
else
echo "Er is geen resultaat";
//-- maak loop t/m 10
for ($i == 1; $i <= 10; $i++) {
//-- toon $i
echo "i: $i<br />"; }
//-- bekijk of var foo is en of foo var is
if ($var == 'foo' && $foo == 'var')
{
//-- zo ja, toon dit
echo "blaat<br />";
}
//-- als de statement false is toon dit
else
{
echo "bleeh<br />";
}
?>
<?
error_reporting(E_ALL);
?>
Zo geeft php netjes de foutmeldingen die het zou moeten geven.
Om een script te debuggen moet je ook netjes en overzichtelijk programmeren. Wanneer je alles door elkaar heen typt, wordt het uiteraard een onoverzichtelijke bende. Gebruik daarom altijd comment tags, en maak gebruik van inspringingen d.m.v. tabs. Wanneer je net begint met het programmeren van PHP scripts, zul je omdat het al lastig genoeg is, hier niet veel aandacht aan geven. Maar geloof me, juist wanneer je begint met PHP is dit juist zo handig omdat je dan de meeste fouten maakt en d.m.v. het netjes en overzichtelijk programmeren er sneller uit zult komen.
Zoiets zou perfect wezen, let hier vooral op de inspringingen:
<?
//-- database connectie maken
$dbhost = "localhost";
$dbuser = "username";
$dbpass = "password";
$dbname = "databasename";
//-- haal gegevens op uit db
$sql = "SELECT id FROM tabel_naam WHERE veld = 'foo'";
$res = mysql_query($sql);
//-- kijk of er wat in de database zit
if (mysql_num_rows($res) >= 1)
{
//-- loop door de array met resultaten
while ($row = mysql_fetch_array($res))
{
//-- toon de resultaten
echo "id nummer: $row[id]<br />";
}
}
//-- toon dit wanneer er niets in de array zit
else
echo "Er is geen resultaat";
//-- maak loop t/m 10
for ($i == 1; $i <= 10; $i++)
{
//-- toon $i
echo "i: $i<br />";
}
//-- bekijk of var foo is en of foo var is
if ($var == 'foo' && $foo == 'var')
{
//-- zo ja, toon dit
echo "blaat<br />";
}
//-- als de statement false is toon dit
else
{
echo "bleeh<br />";
}
?>
Het volgende is niet juist. Zoals je ziet, is het overzicht verdwenen.
<?
//-- database connectie maken
$dbhost = "localhost";
$dbuser = "username";
$dbpass = "password";
$dbname = "databasename";
//-- haal gegevens op uit db
$sql = "SELECT id FROM tabel_naam WHERE veld = 'foo'";
$res = mysql_query($sql);
//-- kijk of er wat in de database zit
if (mysql_num_rows($res) >= 1)
{
//-- loop door de array met resultaten
while ($row = mysql_fetch_array($res))
{
//-- toon de resultaten
echo "id nummer: $row[id]<br />";
}
}
//-- toon dit wanneer er niets in de array zit
else
echo "Er is geen resultaat";
//-- maak loop t/m 10
for ($i == 1; $i <= 10; $i++) {
//-- toon $i
echo "i: $i<br />"; }
//-- bekijk of var foo is en of foo var is
if ($var == 'foo' && $foo == 'var')
{
//-- zo ja, toon dit
echo "blaat<br />";
}
//-- als de statement false is toon dit
else
{
echo "bleeh<br />";
}
?>
Pagina 2
Parse errors
Het debuggen is meestal iets wat erg irritant kan zijn wanneer je al uren met het script bezig bent. Alles lijkt op elkaar en op het laatst weet je geen raad meer.
Om het debug probleem op te lossen, raad ik je ten zeerste een PHP editor aan, waarbij de lijn nummers worden aangegeven! Met PHP is het namelijk zo dat wanneer je ergens een fout hebt staan, de regel nummer meestal ook wordt meegegeven. Vandaar dat dit erg handig is.
Wanneer je een foutmelding krijgt zal dit in de meeste gevallen een parse error zijn. Dit houdt in dat het vrijwel altijd ligt aan een ; vergeten, een akkolade ({ of }) vergeten af te sluiten of bijvoorbeeld een ) of ( te weinig bij een statement. Kijk hier eerst goed na voordat je vragen gaat stellen!
Het volgende zal een parse error geven. Ten eerste omdat achter 'is_numeric($foo)' een ) is vergeten. En ten tweede omdat bij 'Toon dit anders' een puntkomma (;) is vergeten.
<?
//-- vergelijk
if ($var == 'foo' && is_numeric($foo)
{
//-- toon dit wanneer de vergelijking goed is
echo "Toon dit";
}
//-- is de vergelijking niet goed, toon dit
else
echo "Toon dit anders"
?>
Het volgende zou dus wel goed zijn:
<?
//-- vergelijk
if ($var == 'foo' && is_numeric($foo))
{
//-- toon dit wanneer de vergelijking goed is
echo "Toon dit";
}
//-- is de vergelijking niet goed, toon dit
else
echo "Toon dit anders";
?>
Misschien is het een beetje verwarrend, maar bij de 'else' zijn de akkolades er niet. Dit is omdat er maar 1 regel hoeft worden getoond. In dat geval hoef je geen akkolades te gebruiken en kun je het dus gewoon doen zoals te zien is bij het voorbeeld. Als onder 'echo "Toon dit anders";' nog een regel staat, wordt deze sowieso laten zien omdat dat BUITEN de else valt. Goed onthouden, alleen met 1 regel onder een if of else kun je de akkolades weglaten.
Om het debug probleem op te lossen, raad ik je ten zeerste een PHP editor aan, waarbij de lijn nummers worden aangegeven! Met PHP is het namelijk zo dat wanneer je ergens een fout hebt staan, de regel nummer meestal ook wordt meegegeven. Vandaar dat dit erg handig is.
Wanneer je een foutmelding krijgt zal dit in de meeste gevallen een parse error zijn. Dit houdt in dat het vrijwel altijd ligt aan een ; vergeten, een akkolade ({ of }) vergeten af te sluiten of bijvoorbeeld een ) of ( te weinig bij een statement. Kijk hier eerst goed na voordat je vragen gaat stellen!
Het volgende zal een parse error geven. Ten eerste omdat achter 'is_numeric($foo)' een ) is vergeten. En ten tweede omdat bij 'Toon dit anders' een puntkomma (;) is vergeten.
<?
//-- vergelijk
if ($var == 'foo' && is_numeric($foo)
{
//-- toon dit wanneer de vergelijking goed is
echo "Toon dit";
}
//-- is de vergelijking niet goed, toon dit
else
echo "Toon dit anders"
?>
Het volgende zou dus wel goed zijn:
<?
//-- vergelijk
if ($var == 'foo' && is_numeric($foo))
{
//-- toon dit wanneer de vergelijking goed is
echo "Toon dit";
}
//-- is de vergelijking niet goed, toon dit
else
echo "Toon dit anders";
?>
Misschien is het een beetje verwarrend, maar bij de 'else' zijn de akkolades er niet. Dit is omdat er maar 1 regel hoeft worden getoond. In dat geval hoef je geen akkolades te gebruiken en kun je het dus gewoon doen zoals te zien is bij het voorbeeld. Als onder 'echo "Toon dit anders";' nog een regel staat, wordt deze sowieso laten zien omdat dat BUITEN de else valt. Goed onthouden, alleen met 1 regel onder een if of else kun je de akkolades weglaten.
Pagina 3
MySQL errors
Soms heb je een mysql error. Je krijgt dan van die irritante meldingen zoals 'No valid MySQL result in blaat.php on line 13'. Dit houdt niet in dat er een puntkomma, een haakje of akkolade is vergeten. Het houdt wel in dat in de meeste gevallen de MySQL query niet goed is!
Voorbeeld:
<?
//-- haal de gegevens uit de database
$sql = "SELECT id FROM tabel_naam WHERE veld = 'waarde'";
//-- voer de query uit
$res = mysql_query($sql);
//-- zet het id nummer in een variabele
$id = mysql_result($res, 0);
?>
Wanneer tabel_naam niet bestaat, of er geen database connectie tot stand is gebracht, zul je de bovenstaande error krijgen (of een variant daarvan). Hij zal pas bij mysql_result($res, 0); een error geven. Dit omdat hij dan pas met de uitgevoerde SQL code doet (met $res dus). Wanneer je wel een database connectie hebt en je krijgt deze error ook, dan is de query in de meeste gevallen niet goed. Om dit te debuggen moet je in dit geval '$sql' weergeven (dus gewoon via echo) en or die(mysql_error()) achter de mysql_query($res) zetten:
<?
//-- haal de gegevens uit de database
$sql = "SELECT id FROM tabel_naam WHERE veld = 'waarde'";
//-- toon $sql
echo "sql: $sql<br />";
//-- voer de query uit
$res = mysql_query($sql) or die(mysql_error());
//-- zet het id nummer in een variabele
$id = mysql_result($res, 0);
?>
Met de toepassingen die hierboven in het script zijn aangebracht, zul je de fout zo herkennen. Ook als er geen database connectie is. Hij zal dan een error geven zoals: 'No database connection' wanneer de query wordt uitgevoerd. Deze error krijg je d.m.v. de functie mysql_error()). Wanneer er wel een database connectie is en de SQL code ($sql = "SELECT id FROM tabel_naam WHERE veld = 'waarde'";) is niet goed, zal hij een error geven zoals: No valid MySQL result in blaat.php on line 11: Error bericht. Dit kan varieren van: 'Expecting '' near FROM', of 'Column count does not match fields', of 'No such table in database' etc. Via deze foutmeldingen kom je er dus gauw achter!
Voorbeeld:
<?
//-- haal de gegevens uit de database
$sql = "SELECT id FROM tabel_naam WHERE veld = 'waarde'";
//-- voer de query uit
$res = mysql_query($sql);
//-- zet het id nummer in een variabele
$id = mysql_result($res, 0);
?>
Wanneer tabel_naam niet bestaat, of er geen database connectie tot stand is gebracht, zul je de bovenstaande error krijgen (of een variant daarvan). Hij zal pas bij mysql_result($res, 0); een error geven. Dit omdat hij dan pas met de uitgevoerde SQL code doet (met $res dus). Wanneer je wel een database connectie hebt en je krijgt deze error ook, dan is de query in de meeste gevallen niet goed. Om dit te debuggen moet je in dit geval '$sql' weergeven (dus gewoon via echo) en or die(mysql_error()) achter de mysql_query($res) zetten:
<?
//-- haal de gegevens uit de database
$sql = "SELECT id FROM tabel_naam WHERE veld = 'waarde'";
//-- toon $sql
echo "sql: $sql<br />";
//-- voer de query uit
$res = mysql_query($sql) or die(mysql_error());
//-- zet het id nummer in een variabele
$id = mysql_result($res, 0);
?>
Met de toepassingen die hierboven in het script zijn aangebracht, zul je de fout zo herkennen. Ook als er geen database connectie is. Hij zal dan een error geven zoals: 'No database connection' wanneer de query wordt uitgevoerd. Deze error krijg je d.m.v. de functie mysql_error()). Wanneer er wel een database connectie is en de SQL code ($sql = "SELECT id FROM tabel_naam WHERE veld = 'waarde'";) is niet goed, zal hij een error geven zoals: No valid MySQL result in blaat.php on line 11: Error bericht. Dit kan varieren van: 'Expecting '' near FROM', of 'Column count does not match fields', of 'No such table in database' etc. Via deze foutmeldingen kom je er dus gauw achter!
Pagina 4
Variabelen? Superglobals!
Ik ben ze zelf al verschillende keren tegen gekomen. Mensen die vragen 'mijn formulier wil niet versturen, wat is er fout aan'. Ze gebruiken dan ipv. super globals, gewoon een variabele met de naam. Ik geef je twee voorbeelden, 1 met het gebruik van super globals, en 1 zonder:
Hartstikke fout sinds PHP versie 4 en hoger. De namen van het formulier (naam, email en bericht) worden letterlijk als variabele gebruikt. Dus aangeroepen via $naam, $email en bericht.
<?
//-- bekijk of de waardes ingevuld zijn
if ($submit && $naam && $email && $bericht)
{
//-- stuur een e-mail bijvoorbeeld
mail("[email protected]", "Onderwerp", "Bericht", "From: [email protected]");
}
//-- zo niet toon het formulier
else
{
echo "
<form method=\"POST\" ACTION=\"$PHP_SELF\">\n
<p>\n
Naam:<br />\n
<input type=\"text\" name=\"naam\" size=\"30\" /><br />\n
Email:<br />\n
<input type=\"text\" name=\"email\" size=\"30\" /><br />\n
Bericht:<br />\n
<textarea name=\"bericht\" rows=\"5\" cols=\"40\"></textarea>\n
</p>\n
</form>";
}
?>
In plaats van de variabele bij hun naam noemen ($naam, $email en $bericht) moet je superglobals gebruiken. Dit is in dit geval $_POST.
<?
//-- bekijk of de waardes ingevuld zijn
if ($_POST["submit"] && $_POST["naam"] && $_POST["email"] && $_POST["bericht"])
{
//-- stuur een e-mail bijvoorbeeld
mail("[email protected]", "Onderwerp", "Bericht", "From: [email protected]");
}
//-- zo niet toon het formulier
else
{
echo "
<form method=\"POST\" ACTION=\"$PHP_SELF\">\n
<p>\n
Naam:<br />\n
<input type=\"text\" name=\"naam\" size=\"30\" /><br />\n
Email:<br />\n
<input type=\"text\" name=\"email\" size=\"30\" /><br />\n
Bericht:<br />\n
<textarea name=\"bericht\" rows=\"5\" cols=\"40\"></textarea>\n
</p>\n
</form>";
}
?>
Dit is precies hetzelfde met sessions, een formulier die de method 'GET' gebruikt, en cookies. Gebruik ipv de letterlijke naam de volgende variabelen:
Voor POST formulieren: $_POST
Voor GET formulieren: $_GET
Voor SESSIONS: $_SESSION
Voor COOKIES: $$_COOKIE
In een statement gebruik je het zo:
<?
//-- vergelijk
if ($_POST["naam"] && $_SESSION["login_id"] && $_COOKIE["login_pass"])
{
//-- doe iets
echo "..";
}
?>
En wanneer je het toont op het scherm gebruik je het zo:
<?
echo "postnaam: $_POST[naam]<br />";
echo "session: $_SESSION[login_id]<br />";
echo "cookie: $_COOKIE[login_pass]";
?>
Succes met debuggen. Misschien breid ik deze tutorial nog wel even uit.
Hartstikke fout sinds PHP versie 4 en hoger. De namen van het formulier (naam, email en bericht) worden letterlijk als variabele gebruikt. Dus aangeroepen via $naam, $email en bericht.
<?
//-- bekijk of de waardes ingevuld zijn
if ($submit && $naam && $email && $bericht)
{
//-- stuur een e-mail bijvoorbeeld
mail("[email protected]", "Onderwerp", "Bericht", "From: [email protected]");
}
//-- zo niet toon het formulier
else
{
echo "
<form method=\"POST\" ACTION=\"$PHP_SELF\">\n
<p>\n
Naam:<br />\n
<input type=\"text\" name=\"naam\" size=\"30\" /><br />\n
Email:<br />\n
<input type=\"text\" name=\"email\" size=\"30\" /><br />\n
Bericht:<br />\n
<textarea name=\"bericht\" rows=\"5\" cols=\"40\"></textarea>\n
</p>\n
</form>";
}
?>
In plaats van de variabele bij hun naam noemen ($naam, $email en $bericht) moet je superglobals gebruiken. Dit is in dit geval $_POST.
<?
//-- bekijk of de waardes ingevuld zijn
if ($_POST["submit"] && $_POST["naam"] && $_POST["email"] && $_POST["bericht"])
{
//-- stuur een e-mail bijvoorbeeld
mail("[email protected]", "Onderwerp", "Bericht", "From: [email protected]");
}
//-- zo niet toon het formulier
else
{
echo "
<form method=\"POST\" ACTION=\"$PHP_SELF\">\n
<p>\n
Naam:<br />\n
<input type=\"text\" name=\"naam\" size=\"30\" /><br />\n
Email:<br />\n
<input type=\"text\" name=\"email\" size=\"30\" /><br />\n
Bericht:<br />\n
<textarea name=\"bericht\" rows=\"5\" cols=\"40\"></textarea>\n
</p>\n
</form>";
}
?>
Dit is precies hetzelfde met sessions, een formulier die de method 'GET' gebruikt, en cookies. Gebruik ipv de letterlijke naam de volgende variabelen:
Voor POST formulieren: $_POST
Voor GET formulieren: $_GET
Voor SESSIONS: $_SESSION
Voor COOKIES: $$_COOKIE
In een statement gebruik je het zo:
<?
//-- vergelijk
if ($_POST["naam"] && $_SESSION["login_id"] && $_COOKIE["login_pass"])
{
//-- doe iets
echo "..";
}
?>
En wanneer je het toont op het scherm gebruik je het zo:
<?
echo "postnaam: $_POST[naam]<br />";
echo "session: $_SESSION[login_id]<br />";
echo "cookie: $_COOKIE[login_pass]";
?>
Succes met debuggen. Misschien breid ik deze tutorial nog wel even uit.
Reacties
0