quakenet:#php Tutorial

Author: Progman, zuletzt bearbeitet von progman @ 2005/02/16 21:56:48

Bitte beachten Sie, dass die Tutorialkapitel zusammenhängen. Wenn sie direkt auf ein Kapitel verlinkt wurden müssen Sie gegebenenfalls die vorherigen Kapitel auch lesen. Achten Sie beim lesen darauf, dass Sie kein Kapitel überspringen.

Logische Fehler finden

  1. Was sind logische Fehler?
  2. Übersicht ist alles
  3. Alle Fehler anzeigen lassen
  4. If-Abfragen prüfen
  5. Wie sieht das Array aus?
  6. MySQL macht nicht das was ich will

1. Was sind logische Fehler?

Ihr habt nun euer eigenes PHP-Script geschrieben und hochgeladen. Doch es kann sein, dass eure Scripte nicht so laufen, wie ihr das eigentlich wollt. Und gemeint sind jetzt nicht solche Fehler wie Parse Error, Fatal Error oder Warnings. Diese Fehler von denen ich rede nennen sich logische Fehler.

Beim Testen der Scripte kommen dann immer solche Fragen "Warum wird der Text nicht ausgegeben?", "Warum wird in der MySQL-Datenbank nix hinzugefügt?" oder "Warum wird die If-Abfrage nicht ausgeführt?". Für PHP läuft das Script einwandfrei. Er macht genau das, was in der Datei steht, aber das Script macht nicht das, was man will.

Man muss nun den logischen Fehler suchen. PHP kann euch dabei nicht helfen. Er sagt nicht "Du hast $i statt $j geschrieben, der überschreibt dann die Laufvariable der anderen Schleife". PHP hat keine künstliche Intelligenz, die sich den Code angucken und den Fehler beheben kann. Das müsst schon ihr machen. Und dies betrifft nicht nur die Anfänger. Auch Profis machen logische Fehler in ihren Scripten.

Um logische Fehler zu finden gibt es eine Reihe von Suchmethoden, wie man diese Fehler finden kann.

2. Übersicht ist alles

Wenn man PHP-Scripte schreibt, so sollte man sie übersichtlich schreiben. In unübersichtlichen Scripten kann man logische Fehler sehr schlecht erkennen. Erst beim auseinanderpflücken des Scriptes wird man vielleicht feststellen, dass die If-Abfrage ja garnicht da hingehört.

Wie man Scripte übersichtlich schreibt findet man im Tutorialkapitel Einrücken von Programmcode oder im Kapitel Chapter 4. Coding Standards von http://pear.php.net/.

3. Alle Fehler anzeigen lassen

Wenn ihr eure Scripte schreibt und diese testet, werdet ihr vielleicht keinen PHP-Fehler sehen. Also denkt ihr auch, dass es keine gibt. Doch es kann auch sein, dass PHP keine Fehlermeldungen anzeigt. Doch man möchte doch gerne wissen, welche Fehler man gemacht hat. Deswegen sollte man das Error-Level auf E_ALL setzen. Wie das geht und was das bringt findet ihr im Tutorialkapitel Fehler in PHP oder in unserem FAQ-Eintrag 4. Mein Script arbeitet nicht so wie ich es will, jedoch gibt PHP auch keine Fehlermeldung(en) aus. Wenn jemand euch im #PHP Channel fragt "Hast du E_ALL?", dann müsst ihr gucken ob ihr das Error-Level auf E_ALL stehen habt.

4. If-Abfragen prüfen

Manchmal hat man viele verschachtelte If-Abfragen oder vielleicht eine sehr komplexe If-Bedingung, die man untersuchen muss. Da eignet sich die Benutzung von echo. Mit echo sollte man dann einen kleinen Infotext ausgeben, mit dem man weiß, das PHP an dieser Stelle vorbeigekommen ist.

<?php
    error_reporting
(E_ALL);

    echo
"vor If<br />\n";
    if(
$foo == $bar) {
        echo
"gleich<br />\n";
        if(!
$bar) {
            echo
"false<br />\n";
        } else {
            echo
"true<br />\n";
        }
    } else {
        echo
"nicht gleich<br />\n";
    }
?>

Je nach dem welche Texte ausgegeben wurden, weiß man welche If-Abfrage PHP nun ausgeführt hat und welche nicht. Wenn dann eine If-Abfrage nicht ausgeführt wurde, wo man dachte, dass sie es wäre, kann man dann an dieser Stelle den Fehler suchen.

Wenn die If-Abfrage vom Inhalt einer Variable abhängt, sollte man diese vorher ausgeben. Nur zum testen was da drinsteht.

<?php
    error_reporting
(E_ALL);

    echo
'$foo:'.$foo."<br />\n";
    echo
'$bar:'.$bar."<br />\n";
    if(
$foo == $bar) {
        echo
"gleich<br />\n";
        if(!
$bar) {
            echo
"false<br />\n";
        } else {
            echo
"true<br />\n";
        }
    } else {
        echo
"nicht gleich<br />\n";
    }
?>

Dann sieht man, ob der logische Fehler weiter unten oder weiter oben ist. Man arbeitet sich langsam zum logischen Fehler, um ihn dann entsprechend zu beheben.

Diese Technik, den Quellcode mit Massen von echo-Befehlen zu erweitern, nennt man echo-debugging.

5. Wie sieht das Array aus?

Manchmal liefert eine Funktion ein Array zurück. Gerne möchte man wissen, was im den Array drinsteht. Am einfachsten geht das mit der Funktion print_r.

<?php
    error_reporting
(E_ALL);
    
    
$arr = funktion_die_ein_array_returnt();

    
print_r($arr);
?>

Bei print_r eignet sich die Ausgabe in einem <pre>-Element.

<?php
    error_reporting
(E_ALL);
    
    
$arr = funktion_die_ein_array_returnt();
                  
    echo
"<pre>\n";
    
print_r($arr);
    echo
"</pre>\n";
?>

Diese Technik, einen logischen Fehler auf diese Weise zu finden, nennt sich print_r-debugging.

Die Funktion var_dump gibt etwas mehr Informationen über eine Variable aus als die print_r Funktion. Beide Funktionen sind nicht auf Arrays beschränkt. Mit diesen Funktion kann jede Variable auf den Inhalt geprüft werden.

6. MySQL macht nicht das was ich will

Es kann auch vorkommen, dass das PHP-Script einen MySQL-Befehl sendet, der z.B. einen Datensatz bearbeiten soll. Doch das tut es nicht. Deshalb sollte man den Query, den man an die Datenbank schickt, vorher einfach mal mit echo($sql."<br />\n"); ausgeben. Dann guckt man sich den Query im HTML-Browser an und untersucht ihn. Hat er die richtigen Werte? Arbeitet er an der richtigen Tabelle? Stimmt die WHERE-Bedingung? Wenn man dann einen Fehler sieht "Hey, die Zahl ist falsch" dann sollte man den Fehler beheben bzw. suchen, wenn der nicht an dieser Stelle zu beheben ist. Dann greift man wieder auf das echo/print_r-debugging zurück.

Fragen zum aktuellen Thema

  1. Was meint jemand, wenn er 'Hast du E_ALL?' gesagt hat?
  2. Was meint jemand, wenn er 'Was steht im Query drin?' gesagt hat?
Was meint jemand, wenn er 'Hast du E_ALL?' gesagt hat?

Wenn jemand sowas sagt, meint er, ob dein Error-Level auf E_ALL steht. Dies sollte man dann, falls nicht vorhanden, mit der Funktion error_reporting setzen. Die dann entstehenden Notice-Errors sollte man dann erstmal beheben.

Was meint jemand, wenn er 'Was steht im Query drin?' gesagt hat?

Mit "Query" meint man den MySQL-Query, den man an eine Datenbank schickt. Diesen sollte man dann mit echo vor dem Senden mit mysql_query einfach mal ausgeben und gucken was da so drinsteht. Da eignet sich besonders, wenn es ein typischer mehrzeiliger MySQL-Query ist, die Ausgabe in einem <pre>-Element.

<?php
    $richtung
= "ASC";
    
$sql = "SELECT
                foo
            FROM
                tab
            ORDER BY
                datum "
.$richtung.";";
    echo
"<pre>\n";
    echo
$sql;
    echo
"</pre>\n";
   
    
mysql_query($sql) OR die(mysql_error());
?>

Nach oben