Hauptmenü

Untermenü

PHP/MySQL - Fehlersuche - MySQL-Fehler

1. Die Abschnitte

2. Spinnt die Datenbank oder ich?

Diese verzweifelte Frage haben sich schon viele Anfänger gestellt. Ich kann euch trösten. Mit der Datenbank ist alles in Ordnung, der geht es gut. Nur wie kommt man auf diese Antwort?

Man glaubt es kaum, auch eine MySQL-Datenbank liefert uns Fehlermeldungen! Und die bekommt man sogar zu Gesicht! Wenn man nur weiß, wie. Und das werdet ihr hier erfahren.

3. Mögliche Fehler in MySQL

Das Problem

In PHP wird nur dann eigenständig eine Fehlermeldung (Warning) ausgegeben, wenn die Verbindung zum MySQL-Server nicht aufgebaut werden kann. Bei allen anderen seht ihr erst mal gar nichts.

4. Fehlerbehandlung mit PHP

Dafür gibt es zunächst mal eine einfache und ziemlich rabiate Methode, die sich die (sterben) nennt und ein PHP-Befehl ist. Damit wird die Abarbeitung (oh Gott, Beamtendeutsch) eines Scriptes abgebrochen, wenn ein Fehler auftritt. Das verbindet man mit dem (hoffentlich) bekannten mysql_error zu einer Einheit. So man kann gewiss sein, dass wenn mit einer Abfrage irgendwas nicht stimmt, eine Fehlermeldung erscheint. Ein Beispiel. Wir wollen eine Datenbank auswählen.


<?php
  mysql_select_db ($database);
?>

Aber was passiert, wenn die nicht vorhanden ist? Wie erfahre ich davon? So wie oben beschrieben gar nicht! Aber so funktioniert es auf einmal.


<?php
  mysql_select_db ($database) or die (mysql_error());
?>

Ein Wunder! Ein Wunder! Auf einmal erscheint dann eine Fehlermeldung à la "Unknown database ...". Also wissen wir genau, dass etwas nicht stimmt, nämlich der Datenbankname. Dieses or die (mysql_error()) ist das Schweizer Taschenmesser bei der Beseitigung von SQL-Fehlern. Darum sollten vor allem die blutigen Anfänger unter euch eigentlich immer damit arbeiten. So lernt man am Schnellsten. Unter dem Punkt Fehler unterdrücken zeige ich dann noch eine weitere Möglichkeit, die sich auf den Live-Betrieb bezieht.

5. Abfragen

Um Abfragefehler zu vermeiden empfehle ich euch zwei grundsätzliche Prinzipien.

Definition der Abfrage in einer Variablen

Sehr oft sieht man Konstrukte wie


<?php
  $result mysql_query ('SELECT * FROM blubb');
?>

Das ist nicht sehr hilfreich, denn wenn ihr einen Syntax-Fehler habt, könnt ihr den nirgends abfangen. Da könnte man nun wie oben beschrieben, mit die und mysql_error arbeiten.


<?php 
  $result mysql_query ('SELECT * FROM blubb') 
            or die (mysql_error());
?>

Leider sind die Fehlerbeschreibungen von MySQL nicht so prickelnd, vor allem bei der Angabe der fehlerhaften Zeile. Da ist es hilfreich, erst die Abfrage in einen String zu packen und dann bei Fehlern auszugeben.


<?php
  $query 'SELECT 
              bla 
            FROM 
              blubb 
            WHERE id='.$_GET['id'].'
              AND blubber = '.$_GET['blubber'];
  $result mysql_query ($query);
  // Bei Fehlern ausgeben und testen
  echo $query."\n";
?>

Sollte nun zum Beispiel die Variable $_GET['id'] aus welchen Gründen auch immer, nicht vorhanden oder die Abfrage an sich falsch sein, so könnt ihr das über den echo-Befehl ausgeben und im MySQL-Frontend eurer Wahl eingeben und überprüfen. Eine weitere Möglichkeit, die auch ich nutze, ist ein Editor, der SQL-Befehle farblich darstellen kann. Da sieht man dann ganz schnell, wo es hakt. Tipp: sowohl das Notepad++ als auch HeidiSQL können das. Schaut mal bei dem Punkt Software vorbei.

Die Sache mit dem Rückgabewert

Wenn eine Abfrage mit INSERT oder UPDATE erfolgreich ausgeführt wurde, so wird einfach ausgedrückt, im Erfolgsfall ein true zurückgeliefert, ansonsten ein false. Das entspricht zwar nicht ganz den Tatsachen, soll für eine erste Erklärung aber reichen. Damit kann man auf einfache Art und Weise Fehler abfangen.

Ein Anwendungsbeispiel könnte so aussehen. Wir bekommen von einem Kunden zum Beispiel Adressdaten in einer csv-Datei und sollen die in einem Rutsch in die Datenbank einlesen. Nehmen wir jetzt mal an (was man sowieso immer tun sollte), dass es fehlerhafte Einträge gibt, die dazu führen, dass eine INSERT-Anweisung nicht ausgeführt werden kann. Jetzt möchten wir aber nicht jedes Mal das Script abbrechen, wenn dieser Fall eintritt, sondern nur wissen, in welcher Zeile die Wurzel allen Übels steckt. Das kann man zum Beispiel so machen.


<?php
  $num 1;
  while ($line fgets ($open))
  {
    $split explode (','$line);
    $query 'INSERT INTO tabelle ('.$split[0].','.$split[1].',';
    $query .= "'".$split[2]."'".')';
    $result mysql_query ($query);
    // Ausgabe bei Fehlern
    if (!$result)
    {
      echo 'Fehlerhafte Einträge in Zeile '.$num.'<br>';
    }
    $num++;
  }
?>

Eigentlich ganz simpel. Ist die SQL-Abfrage fehlerhaft und kann nicht ausgeführt werden, liefert uns die Variable $result 0 also false zurück. Und damit kann man wunderbar in der csv-Datei die falschen Einträge suchen.

zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt