Hauptmenü

Untermenü

PHP/MySQL - Fehlersuche - Testausgaben

1. Die Abschnitte

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.

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