Tutorials
Debuggen voor beginners
iedereen kan het!
Pagina 1
Inleiding
Deel 2 van de hitserie , 'programmeren voor mensen die het wel willen kunnen maar het niet kunnen'.
Debuggen is misschien wel het allerleukste om te doen in een code. Dit is omdat het de beste manier is om een stuk code goed te begrijpen. En hoe meer code je snapt, hoe meer je er weer mee kan doen in een volgend script. Dingen oplossen geeft een kikk :))
Het hele idee achter debuggen is de logica van PHP onder de knie krijgen. PHP loopt netjes van boven naar onder, van links naar rechts door je code heen. Alle fouten, jazeker, alle fouten zijn door goed effectief debuggen binnen een paar seconden te vinden.
Let wel, deze guide is om aan te tonen waar je fout kan lopen en hoe je dit zelf kan achterhalen, zodat de mensen het ook snappen.
[php]error_reporting[/php](); zal ik niet behandelen. Dit puur omdat het me hier gaat dat een nieuwe scripter zelf zijn/haar eigen code snapt, zonder PHP het te laten doen voor hem/haar.
Debuggen is misschien wel het allerleukste om te doen in een code. Dit is omdat het de beste manier is om een stuk code goed te begrijpen. En hoe meer code je snapt, hoe meer je er weer mee kan doen in een volgend script. Dingen oplossen geeft een kikk :))
Het hele idee achter debuggen is de logica van PHP onder de knie krijgen. PHP loopt netjes van boven naar onder, van links naar rechts door je code heen. Alle fouten, jazeker, alle fouten zijn door goed effectief debuggen binnen een paar seconden te vinden.
Let wel, deze guide is om aan te tonen waar je fout kan lopen en hoe je dit zelf kan achterhalen, zodat de mensen het ook snappen.
[php]error_reporting[/php](); zal ik niet behandelen. Dit puur omdat het me hier gaat dat een nieuwe scripter zelf zijn/haar eigen code snapt, zonder PHP het te laten doen voor hem/haar.
Pagina 2
Mijn script geeft alleen maar rare errors
Rare errors zijn vaak header errors, sql errors of parse errors
Zo raar zijn ze eigenlijk helemaal niet, ze geven meteen aan in grote lijnen waar de fout zit:
Header error - foutieve volgorde van je code
SQL error - fout in je query, tabel/database of afhandeling van je query
Parse error - Vroeger toen we nog guldens hadden noemden we dit een tikfout
De beginnende programmeurs zullen het meeste te maken krijgen met parse errors.
parse error: unexpected *waarde* on line *lijn*
Vaak is het zo dat een variabele niet goed wordt afgesloten, of dat een if-statement niet helemaal goed genoteerd staat.
Wat je terugziet in je error is dat op de regel na je fout de error staat.
Dus als je op lijn 20 een unexpected (onverwacht) waarde krijgt, is de kans zeer groot dat op de regel daarvoor iets verkeerd genoteerd staat. Hij verwacht dus een andere waarde te zien, voor de 1e waarde op regel 20.
parse error: unexpected END
Een soortgelijke fout heeft te maken met het hele 'wat je begint moet je ook afsluiten' principe van PHP.
Vaak is dit een if() die geen afsluitende } heeft. Dit geldt ook voor een while for foreach etc.
Dit is een kwestie van tellen en van meteen correct programmeren. Maak je een if; zet direct de { } neer, dit voorkomt dit soort fouten. Als je achteraf nog moet uitrekenen hoeveel } je nodig hebt, ga je gegarandeerd tegen fouten aanlopen.
Zo raar zijn ze eigenlijk helemaal niet, ze geven meteen aan in grote lijnen waar de fout zit:
Header error - foutieve volgorde van je code
SQL error - fout in je query, tabel/database of afhandeling van je query
Parse error - Vroeger toen we nog guldens hadden noemden we dit een tikfout
De beginnende programmeurs zullen het meeste te maken krijgen met parse errors.
parse error: unexpected *waarde* on line *lijn*
Vaak is het zo dat een variabele niet goed wordt afgesloten, of dat een if-statement niet helemaal goed genoteerd staat.
Wat je terugziet in je error is dat op de regel na je fout de error staat.
Dus als je op lijn 20 een unexpected (onverwacht) waarde krijgt, is de kans zeer groot dat op de regel daarvoor iets verkeerd genoteerd staat. Hij verwacht dus een andere waarde te zien, voor de 1e waarde op regel 20.
parse error: unexpected END
Een soortgelijke fout heeft te maken met het hele 'wat je begint moet je ook afsluiten' principe van PHP.
Vaak is dit een if() die geen afsluitende } heeft. Dit geldt ook voor een while for foreach etc.
Dit is een kwestie van tellen en van meteen correct programmeren. Maak je een if; zet direct de { } neer, dit voorkomt dit soort fouten. Als je achteraf nog moet uitrekenen hoeveel } je nodig hebt, ga je gegarandeerd tegen fouten aanlopen.
Pagina 3
Ik krijg alleen maar een header error
error, headers already sent by *document* on line *lijn*
Dit heeft te maken met de volgorde van je document. Een header is een soort commando dat je aan je pagina meegeeft om niet iets te parsen (op het scherm te tonen) maar te executen (uitvoeren). Bijvoorbeeld:
<?
header('location:index.php');
?>
Als dit bovenaan je pagina staat, zal je direct verwezen worden naar index.php. Erg simpel. Waar de meeste header errors vandaan komen is bijvoorbeeld:
Dit bovenstaande gaat een leuke headererror geven. Waarom? Omdat er al output (er is al iets geschreven) is , voordat de header komt. Dit is op te lossen door EERST je checks en phpcode te doen bovenaan je pagina. En pas als er output moet komen, dat ook neerzetten. Het is tenslotte zinloos om htmltags te schrijven terwijl je toch je pagina direct laat verwijzen naar een andere pagina.
Hetzelfde geldt voor session_start();
Dit zet je ALTIJD bovenaan je pagina. Maakt niet uit wat erna komt, ALTIJD!
Alle header-errors zijn op te lossen door je PHP pagina correct in te delen qua volgorde. Er zijn andere vieze gore oplossingen voor, maar die mogen van mij verbannen worden naar een cel met paris hilton.
Dit heeft te maken met de volgorde van je document. Een header is een soort commando dat je aan je pagina meegeeft om niet iets te parsen (op het scherm te tonen) maar te executen (uitvoeren). Bijvoorbeeld:
<?
header('location:index.php');
?>
Als dit bovenaan je pagina staat, zal je direct verwezen worden naar index.php. Erg simpel. Waar de meeste header errors vandaan komen is bijvoorbeeld:
<html>
<body>
<?
if ($_POST['submit'] == 'verzend formulier')
{
header('location:verzonden.php');
} else {
echo 'ga terug, formulier is niet verzonden';
}
?>
</body>
</html>
Dit bovenstaande gaat een leuke headererror geven. Waarom? Omdat er al output (er is al iets geschreven) is , voordat de header komt. Dit is op te lossen door EERST je checks en phpcode te doen bovenaan je pagina. En pas als er output moet komen, dat ook neerzetten. Het is tenslotte zinloos om htmltags te schrijven terwijl je toch je pagina direct laat verwijzen naar een andere pagina.
Hetzelfde geldt voor session_start();
Dit zet je ALTIJD bovenaan je pagina. Maakt niet uit wat erna komt, ALTIJD!
Alle header-errors zijn op te lossen door je PHP pagina correct in te delen qua volgorde. Er zijn andere vieze gore oplossingen voor, maar die mogen van mij verbannen worden naar een cel met paris hilton.
Pagina 4
Ik krijg een aantal SQL errors in mijn paginas
SQL errors kunnen een aantal verschillende oorzaken hebben, sommige zijn af te vangen met goede contole , voor andere errors zal je naar je tabellen/databases moeten kijken.
Voor een correcte heldere opmaak van SQL en hoe je dit het duidelijkst op kan zetten als starter :
klikkerdeklik
Voor een correcte heldere opmaak van SQL en hoe je dit het duidelijkst op kan zetten als starter :
klikkerdeklik
Pagina 5
Ik krijg helemaal niets te zien
Dit is het echte debug werk. De lastigste errors zijn tenslotte die errors die je niet kan zien.
Ik zal dit onderverdelen in een aantal categorien:
- POST / GET paginas (form)
- Variabelen check
- Doodlopende paginas
POST / GET pagina's
De 3 meest gebruikte checks voor variablen zijn:
[php]isset()[/php]
[php]empty()[/php]
en de gewone if($var)
Wat het meest duidelijk is om te gebruiken is een combinatie van isset en empty. Dat zal dan if (isset($var) && !empty($var)) worden. Als var bestaat, en niet leeg is. (wat moet je tenslotte met een lege var..)
Je hebt een aantal velden die je invult en je wil die op een volgende pagina verwerken, je klikt op verzenden oid en er komt een witte pagina...
Als je het al goed hebt gedaan zitten er in je verwerk pagina een aantal checks op variabelen. Bijvoorbeeld:
<?
if (isset($_POST['veld']) && !empty($_POST['veld']))
{
// doe iets
}
?>
Als dit je enige actie is op die pagina en er gebeurd niets is het natuurlijk vrij simpel. Het veld is niet goed verzonden of het veld is leeg.
Maar wat als je nu 20 velden meestuurd?
Een simpele oplossing hiervoor is [php]print_r[/php]();
Als je bovenaan je verwerk-pagina zet: print_r($_POST); exit; zal je alle POST velden, met waardes te zien krijgen.
Je kan zo erg gemakkelijk kijken, zit mijn veld ertussen, wat staat erin, is alles goed geschreven...
mijn veld zit ertussen en heeft de juiste waarde : De fout zit dan in een ander veld.
mijn veld zit ertussen maar heeft geen waarde : Je hebt niets in het veld ingevoerd.
mijn veld zit er niet tussen : Er zit een fout in je formulier, check je veldnaam of veldtype.
ik krijg helemaal geen velden en waardes te zien : Je form POST niet of er staan geen veldnamen in je inputvelden.
Een van deze zou van toepassing moeten zijn, al met al vrij gemakkelijk te controleren.
Ik zal dit onderverdelen in een aantal categorien:
- POST / GET paginas (form)
- Variabelen check
- Doodlopende paginas
POST / GET pagina's
De 3 meest gebruikte checks voor variablen zijn:
[php]isset()[/php]
[php]empty()[/php]
en de gewone if($var)
Wat het meest duidelijk is om te gebruiken is een combinatie van isset en empty. Dat zal dan if (isset($var) && !empty($var)) worden. Als var bestaat, en niet leeg is. (wat moet je tenslotte met een lege var..)
Je hebt een aantal velden die je invult en je wil die op een volgende pagina verwerken, je klikt op verzenden oid en er komt een witte pagina...
Als je het al goed hebt gedaan zitten er in je verwerk pagina een aantal checks op variabelen. Bijvoorbeeld:
<?
if (isset($_POST['veld']) && !empty($_POST['veld']))
{
// doe iets
}
?>
Als dit je enige actie is op die pagina en er gebeurd niets is het natuurlijk vrij simpel. Het veld is niet goed verzonden of het veld is leeg.
Maar wat als je nu 20 velden meestuurd?
Een simpele oplossing hiervoor is [php]print_r[/php]();
Als je bovenaan je verwerk-pagina zet: print_r($_POST); exit; zal je alle POST velden, met waardes te zien krijgen.
Je kan zo erg gemakkelijk kijken, zit mijn veld ertussen, wat staat erin, is alles goed geschreven...
mijn veld zit ertussen en heeft de juiste waarde : De fout zit dan in een ander veld.
mijn veld zit ertussen maar heeft geen waarde : Je hebt niets in het veld ingevoerd.
mijn veld zit er niet tussen : Er zit een fout in je formulier, check je veldnaam of veldtype.
ik krijg helemaal geen velden en waardes te zien : Je form POST niet of er staan geen veldnamen in je inputvelden.
Een van deze zou van toepassing moeten zijn, al met al vrij gemakkelijk te controleren.
Pagina 6
Ik krijg niets te zien en mijn code is enorm lang
Dat kan lastig zijn. Geen output die er wel zou moeten komen. Eigenlijk is het hier een kwestie van kijken hoe ver je pagina nog komt.
Bijvoorbeeld een pagina als deze:
<?
if ($var == 'waarde')
{
if ($var == 'andere waarde1')
{
// doe dit
}
if ($var == 'andere waarde2')
{
if ($var == 'andere waarde')
{
// doe dit
}
}
if ($var == 'andere waarde3')
{
// doe dit
}
if ($var == 'andere waarde4')
{
// doe dit
}
} else {
if ($var == 'andere waarde5')
{
// doe dit
}
}
?>
Je krijgt helemaal geen output, terwijl er een boel output zou kunnen komen.
Wat het makkelijkst is, ook om zelf PHP te begrijpen ermee, is bij de 1e IF een echo erin te zetten. Bijv echo 1;
Run je pagina, krijg je nu 1 te zien? Dan komt je pagina tot zover iig nog. Voeg dit bij al je IFs toe, of waar jij zelf denkt dat zinvol is.
Uiteindelijk zal je erachter komen dat je pagina bij een nummer stopt. Vraag je dan af, waarom zie ik het volgende nummer niet?
Check wat er moet gebeuren om het nummer weer te geven.
Check altijd je variabelen (zie vorige pagina) , 99 van de 100 keer zal je script vastlopen op een fout in je vars.
Je weet waar je fout zit. Das erg mooi. Maar om dit te voorkomen is het handig om bijvoorbeeld bij elke IF een ELSE te gebruiken.
Je kan zo gemakkelijk zien, deze if kom ik niet door, waarom niet. Dan is het weer simpel debuggen.
Bijvoorbeeld een pagina als deze:
<?
if ($var == 'waarde')
{
if ($var == 'andere waarde1')
{
// doe dit
}
if ($var == 'andere waarde2')
{
if ($var == 'andere waarde')
{
// doe dit
}
}
if ($var == 'andere waarde3')
{
// doe dit
}
if ($var == 'andere waarde4')
{
// doe dit
}
} else {
if ($var == 'andere waarde5')
{
// doe dit
}
}
?>
Je krijgt helemaal geen output, terwijl er een boel output zou kunnen komen.
Wat het makkelijkst is, ook om zelf PHP te begrijpen ermee, is bij de 1e IF een echo erin te zetten. Bijv echo 1;
Run je pagina, krijg je nu 1 te zien? Dan komt je pagina tot zover iig nog. Voeg dit bij al je IFs toe, of waar jij zelf denkt dat zinvol is.
Uiteindelijk zal je erachter komen dat je pagina bij een nummer stopt. Vraag je dan af, waarom zie ik het volgende nummer niet?
Check wat er moet gebeuren om het nummer weer te geven.
Check altijd je variabelen (zie vorige pagina) , 99 van de 100 keer zal je script vastlopen op een fout in je vars.
Je weet waar je fout zit. Das erg mooi. Maar om dit te voorkomen is het handig om bijvoorbeeld bij elke IF een ELSE te gebruiken.
Je kan zo gemakkelijk zien, deze if kom ik niet door, waarom niet. Dan is het weer simpel debuggen.
Pagina 7
Samenvatting!
Debuggen is:
- probleem constateren
- probleem lokaliseren
- probleem oplossen
- geen probleem!
Elke malloot kan een fout oplossen. De sleutel daartoe is nog altijd overzichtelijk een gestructureerd programmeren.
In gedownloade scripts of gekochte scripts ga je veel langer over een fout doen dan in een zelf gemaakt script. Dat is puur omdat je bij een eigen script het hele vooruitdenken al hebt gehad. Je weet wat je script doet en wat eruit moet komen.
Tis een beetje het spiekbriefjes principe. Zodra je iets hebt opgeschreven heb je erover nagedacht en is je briefje niet meer nodig. Schrijf een stukje PHPcode en je weet meteen waar je moet zoeken bij een fout.
Schrijf je PHP daarom ALTIJD zelf en ga geen skrippies downloaden jo! Tenzij het voorzien is van genoeg commentaar en aanwijzingen.
Dan nog, lees je code eens door, klopt iets nog met hoe jij het zelf ooit verzonnen had.
Schrijf je code netjes, overzichtelijk en zorg dat er een duidelijke structuur in zit, success!
- probleem constateren
- probleem lokaliseren
- probleem oplossen
- geen probleem!
Elke malloot kan een fout oplossen. De sleutel daartoe is nog altijd overzichtelijk een gestructureerd programmeren.
In gedownloade scripts of gekochte scripts ga je veel langer over een fout doen dan in een zelf gemaakt script. Dat is puur omdat je bij een eigen script het hele vooruitdenken al hebt gehad. Je weet wat je script doet en wat eruit moet komen.
Tis een beetje het spiekbriefjes principe. Zodra je iets hebt opgeschreven heb je erover nagedacht en is je briefje niet meer nodig. Schrijf een stukje PHPcode en je weet meteen waar je moet zoeken bij een fout.
Schrijf je PHP daarom ALTIJD zelf en ga geen skrippies downloaden jo! Tenzij het voorzien is van genoeg commentaar en aanwijzingen.
Dan nog, lees je code eens door, klopt iets nog met hoe jij het zelf ooit verzonnen had.
Schrijf je code netjes, overzichtelijk en zorg dat er een duidelijke structuur in zit, success!
Reacties
0