PHP/MySQL - Fehlersuche - MySQL-Fehler
1. Die Abschnitte
- Überblick
- Fehlertypen
- Error Reporting
- MySQL-Fehler
- Syntaxfehler
- Idiotische Fehler
- Testausgaben
- Falsche Fehler
- Fehler unterdrücken
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
- Es konnte keine Verbindung zum MySQL-Server aufgebaut werden (warum auch immer).
- Es wurde eine nicht vorhandene Datenbank, Tabelle oder Spalte ausgewählt.
- Rechtschreib-, also Syntax-Fehler.
- Fehlerhafte Abfragen, die nicht den Vorgaben entsprechen.
- Unlogische Abfragen, die nicht das ausgeben, was man erwartet.
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