PHP/MySQL - Fehlersuche - Testausgaben
1. Die Abschnitte
- Überblick
- Fehlertypen
- Error Reporting
- MySQL-Fehler
- Syntaxfehler
- Idiotische Fehler
- Testausgaben
- Falsche Fehler
- Fehler unterdrücken
2. Wer ist schuld?
So, nachdem ihr alle Ratschläge aus den vorherigen Abschnitten beherzt habt, kommen wir nun zu logischen Fehlern innerhalb eurer Programmierung. Sehr oft glaubt man, dass der eigene Code einwandfrei ist und so laufen müsste, wie man es geplant hat. Falsch! Wenn etwas nicht so funktioniert wie ihr wollt, dann liegt es an euch. Nicht an PHP, nicht an MySQL, nicht am Apache, echte Bugs in diesem Programmen mal ausgenommen.
3. OK, ich bin schuld. Und nun?
Das Zauberwort heißt Testausgaben! Das bedeutet, dass man sich an den Stellen im Code die Werte von Variablen ausgeben lässt, wo man meint, es hakt. Nehmen wir mal an, dass wir Werte aus einer Datenbank ausgeben möchten, sobald eine Bedingung erfüllt ist.
<?php
if ($blubb == 'bla')
{
$query = 'SELECT bla FROM blubber';
$result = mysql_query ($query);
while ($row ....) usw.
}
?>
So jetzt kommt auf einmal nichts! Da hätten wir in diesem Fall drei mögliche Fehlerquellen.
- Die SQL-Abfrage ist falsch.
- Die Abfrage liefert nichts zurück.
- Die variable
$blubb
hat nicht den erwarteten Wert.
Wie ihr mit Möglichkeit eins und zwei umgeht, habe ich euch schon vorher gezeigt. Kommen wir nun zum
dritten Punkt. if ($blubb == 'bla')
wird ja nur dann ausgeführt, wenn der Wert stimmt. Also
wie debuggen wir in diesem Fall? Riiiischtisch! Wir setzen vor dieser Bedingung eine Ausgabe:
<?php
echo $blubb.'###';
if ($blubb ...)
?>
Das mit dem .'###
mache ich immer, damit ich diese Testausgabe im Browserfenster schneller
finde. Ein weiterer Vorteil liegt darin, dass in jedem Fall etwas erscheint. Hat die Variable $blubb
zum Beispiel gar keinen Wert, so erscheint zumindest ein ###
. Und nun schaut man sich in aller Ruhe
an, welches Ergebnis uns entgegen springt. Wenn es kein "bla" ist, dann habt ihr Mist gebaut. Also begebt euch dann
auf die Suche nach der Stelle, wo ihr $blubb
einen Wert zugewiesen habt. Geschieht dies in einer
anderen Bedingung, so geht das Spielchen von vorne los.
4. Die magischen Zauberformeln
Sehr oft gibt es Probleme mit Werten, die aus Formularen oder einfachen Arrays kommen, in Sessions stecken oder per
GET
-Parameter übergeben werden. Dafür bietet uns PHP zwei wunderbare Funktionen, die da print_r
und
var_dump
lauten. Damit bekommen wir auf einen Blick alle notwendigen Informationen.
<?php
// Formularinhalte prüfen
print_r ($_POST);
// GET-Parameter prüfen
print_r ($_GET);
// Sessions prüfen
print_r ($_SESSION);
// Überprüfung eines Arrays mit Typenangabe
$array = array (
array ("bla", "blubb", "blubber"),
array ('schwall' => 1, 'laber' => 10.5)
);
var_dump ($array);
?>
Sollte ich ab sofort einen von euch in meinem Lieblingsforum erwischen, der
nicht mit print_r
und var_dump
arbeitet, dem reiße ich den Kopf ab. Ach ja, noch ein kleiner Tipp.
Packt die Zauberformeln immer in ein <pre>
-Tag. Dann müsst ihr euch nicht wie ich Torfkopp immer erst den Quellcode
anzeigen lassen, um die Struktur zu erfassen, sondern könnt die saubere Ausgabe auch schon wunderbar im Browser bewundern.
<?php
echo '<pre>';
print_r($_POST);
echo '</pre>';
?>
5. Und jetzt was ganz Detailliertes
Für diejenigen, die es genau wissen wollen, gibt es die Möglichkeit einer Ablaufverfolgung. Dazu stellt uns PHP die Funktion
debug_backtrace
zur Verfügung. Dabei werden alle Informationen in einem Array zusammengefasst, das man dann
wunderbar mit var_dump
ausgeben kann.
<?php
function bla($blubb)
{
var_dump(debug_backtrace());
}
bla('blubber');
?>
Und das Ergebnis sieht dann zum Beispiel so aus.
array(1)
{
[0]=>
array(4)
{
["file"]=>
string(60) "L:\www\tutorials\php_fehler\testausgaben.php"
["line"]=>
int(180)
["function"]=>
string(3) "bla"
["args"]=>
array(1)
{
[0]=>
&string(7) "blubber"
}
}
}
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt