Debugging og fejlsøgning - gør det selv

Det kan være frustrerende at ikke kunne komme henover et specifikt problem mens man udvikler.
Ofte angriber man med de forkerte værktøjer og behøver hjælp for at komme videre. Men nu er det også vigtigt at man selv gør en indsats.
Det hjælper både på forståelsen af den fejl man har lavet og hvordan man kan undgå og afhjælpe fejlen en anden gang.
Vi laver alle fejl - nu skal vi bare have dem løst!

I denne artikel vil jeg fokusere på metoder og værktøjer til at fejlsøge og debugge sine scripts - meget af det er vanesager og der skal derfor også fokus på at indarbejde sig nogle gode vaner og rutiner fremover.
Forudsætningen for artiklens forståelse er et grundlæggende kendskab til PHP.

Artiklen er opdelt således:
  1. En simpel funktion...
    1. Hvad gør den simple funktion?
    2. Funktionen fejler?
    3. Hvad kan jeg bruge return til?
    4. Hvad gør den simple funktion?
  2. Hvor og hvorfor fejler din funktion
    1. echo er din ven

En simpel funktion...

Funktioner har den fordel at man kan pakke en rutine, man ofte udfører, ind i en sådan og få denne funktion til at udføre rutinen igen og igen og derved spare sig en masse liniers kode.

Hvad gør den simple funktion?

Den simple funktion gør det du beder den om. Ikke mere eller mindre. Din funktion bør ikke indeholde for mange liniers kode, for så forsvinder overskueligheden og risikoen for fejl bliver større.

Et eksempel på en simpel funktion, som gør hvad du beder den om, kunne være udformet således:

<?php

    
function writeTextToFile($filename$textstring)
    {
        
file_put_contents($filename$textstring);
    }

?>

Eksemplet ovenfor er en unødvendig funktion, indholdet taget i betragtning - Jeg har ikke sparet nogle linier og funktionen fylder mere end den ene linie inde i funktionen.

Funktionen fejler?

Lad os antage at du har afprøvet funktionen - dog uden held. Funktionen melder fejl og det er faktisk ikke særlig hensigtsmæssigt at din side fejler og du så ikke kommer videre.
Din besøgende bruger har ikke noget at bruge fejlmeddelsen til og du finder i princippet heller ikke ud af at fejlen er opstået.

Vores første opgave er at sikre os at fejlen ikke opstår, men at vi tager hånd om det inden.

<?php

    
function writeTextToFile($filename$textstring)
    {
        if(!
file_exists($filename))
            return 
false;

        
file_put_contents($filename$textstring);

        return 
true;
    }

?>

Når du kalder et return vil din funktion ophøre og din funktion vil returnere hvad du sætter efter return.

Hvad kan jeg bruge return til?

Idet du returner noget fra din funktion, har du også mulighed for at undersøge om du får det resultat du ventede - her er en god funktion var_dump()
var_dump() har den fordel at hvis der er noget at vise, uanset om det er et array, et objekt, en streng eller tal, så vil var_dump() "dumpe" indholdet af det du forespørger på så du kan hurtigt se om det var som forventet.

<?php

    $resultat 
writeTextToFile("test.txt""Dette er en streng");
    
var_dump();

?>

Ovenstående vil resultere at var_dump() enten skriver bool(false) eller bool(true)
Her er det værd at bemærke at ændringen i funktionen, vi lavede før, vil påvirke udfaldet af funktionen. Hvis filen vi forespørger på ikke eksisterer, returneres bool(false) og funktionen ophører.
Er det ikke tilfældet vil funktionen blot fortsætte og forsøge at skrive indholdet til filen med file_put_contents().

Men funktionen fejler stadig?

Desværre er der stadig flere ting at tage højde for. file_put_contents() vil stadig fejle, hvis der ikke er de rigtige skriverettigheder til filen.
Løsningen er at vi fortsætter med at kontrollere vores handlinger:

<?php

    
function writeTextToFile($filename$textstring)
    {
        if(!
file_exists($filename))
            return 
false;

        if(!
is_writable($filename))
            return 
false;

        
file_put_contents($filename$textstring);

        return 
true;
    }

?>

Nu vil funktionen også returnere bool(false) hvis vi ikke har adgang til at skrive til filen.

Nu har vi faktisk fået en funktion, som vi kan bruge, uden at systemet fejler.
Lad os teste det.

<?php

    
function writeTextToFile($filename$textstring)
    {
        if(!
file_exists($filename))
            return 
false;

        if(!
is_writable($filename))
            return 
false;

        
file_put_contents($filename$textstring);

        return 
true;
    }


    
$res writeTextToFile("test.txt""Dette er en streng");

    if()
    {
        echo 
"Din tekst blev gemt";
    }
    else
    {
        
// kode der sender dig en mail eller på anden måde logger at teksten ikke blev gemt
        
echo "Din tekst blev desværre ikke gemt, men fejlen er noteret og vi kigger på det hurtigtst muligt";
    }


?>

Hvor og hvorfor fejler din funktion

Som det er nu, virker funktionen på den måde at du nu får besked om at din funktion har fejlet.
Men det har ikke just lettet på din fejlsøgning - det eneste du nu ved er at det enten er fordi filen ikke eksisterer eller fordi at der ikke kan skrives til filen.
Det er så nu vi får brug for at debugge.

echo er din ven

Vi fortsætter med funktionen fra før og antager at du ikke får skrevet nogle data i den ønskede fil.
For at debugge, ændrer vi midlertidigt i kildekoden, så vi kan få noget ud af funktionen som giver mening. Ved at tilføje echo på nogle strategiske placeringer, vil vi hurtigt kunne finde ud af hvad problemet er.

<?php

    
function writeTextToFile($filename$textstring)
    {
        if(!
file_exists($filename))
        {
            echo 
"Filen eksisterer ikke";
            return 
false;
        }
        if(!
is_writable($filename))
        {
            echo 
"Der må ikke skrives til filen";
            return 
false;
        }

        
file_put_contents($filename$textstring);

        return 
true;
    }

?>

Nu vil du, alt afhængigt af fejlen, få at vide hvad problemet er.
Hvis problemet nu er at filen ikke eksisterer, får du det at vide og kan derfor hurtigt oprette den, eller rette stien til, når du kalder funktionen.
Såfremt du ikke må skrive til den eksisterende fil, får du også dette at vide og du kan derfor nu give de rette rettigheder til filen. Når du har rettet fejlen, kan du også rette din kode i funktionen tilbage til det oprindelige.

En simpel funktion er nu blevet gennemgået - kontrol af tilgang til en aktuel fil er blevet tilføjet, eksempel på at finde eventuelle fejl er blevet beskrevet - du er nu blevet introduceret for en simpel teknik som giver dig mulighed for at selv finde og rette fejl i dine scripts.