MySQLi - Fehlerbehandlung
1. Same procedure as every year
Bei der Behandlung von Fehlern hat sich (leider) im Prinzip nicht viel getan. Denn das Handling ist (fast) genau so wie bei der MySQL-Erweiterung.
2. Verbindungsaufbau
Hier reagiert die MySQLi-Erweiterung genau so wie die von MySQL. Wenn die Verbindung zum Server nicht gelingt, so wird ein Warning
ausgeworfen. Wenn man dagegen diese Meldung unterdrückt hat (wie auch immer) so gibt es die beiden Eigenschaften/Funktionen
connect_errno
und connect_error
.
// Objektorientiert
@$mysqli = new mysqli('host', 'user', 'falsches_pw', 'db');
if ($mysqli->connect_errno) {
echo 'Sorry, die Verbindung zu unserem superfetten endgeilen
Server ist hops gegangen. Wegen '.$mysqli -> connect_error;
}
// Prozedural
@$mysqli = mysqli_connect('host', 'user', 'falsches_pw', 'db');
if (mysqli_connect_errno($mysqli)) {
echo '... '.mysqli_connect_error($mysqli);
}
Wichtig!
Im Gegensatz zur MySQL-Erweiterung gibt es einen großen Unterschied. Bei Letzterer konnte man wirklich alles mit mysql_error
erschlagen. Bei MySQLi dagegen gibt es eine Trennung zwischen Verbindungs- und sonstigen Fehlern.
connect_error
Laut Doku kann man das objektorientiert(!) zweifelsfrei erst ab PHP 5.2.9 einsetzen. Ansonsten sollte man auf die prozedurale Variante umsteigen. Wie das möglich ist, zeige ich euch unter dem Punkt Besonderheiten.
3. Sonstige Fehler
Hier reagiert die MySQLi-Erweiterung genau so wie die von MySQL. Nämlich erst mal gar nicht. Ist also die Syntax fehlerhafte oder die
Abfrage an sich falsch, so muss man dafür auf error
beziehungsweise errno
zugreifen.
// Objektorientiert
$mysqli = new mysqli('host', 'user', 'pw', 'db');
$query = 'SELECT bla FROM blubb WHERE bla=\'blubber';
echo $mysqli->errno.'-'.$mysqli->error;
// Prozedural
$mysqli = mysqli_connect('host', 'user', 'pw', 'db');
$query = 'SELECT bla FROM blubb WHERE bla=\'blubber';
echo mysqli_error($mysqli);
4. Fehler abfangen
Hier gibt es die üblichen Bordmittel von PHP. Entweder mit einer reinen if-Bedingung
oder mit einem try ... catch
Block. Denn wenn eine Abfrage einen Fehler aufweist, so gibt query()
immer ein false
zurück.
// Objektorientiert
$mysqli = new mysqli('host', 'user', 'pw', 'db');
try {
// Tabelle bla existiert nicht
$query = 'SELECT * FROM bla';
if(!$mysqli -> query($query)) {
throw new Exception($mysqli -> error);
}
}
catch (Exception $e) {
echo $e -> getMessage();
}
// Prozedural
$mysqli = mysqli_connect('host', 'user', 'pw', 'db');
try {
// Tabelle bla existiert nicht
$query = 'SELECT * FROM bla';
if(!mysqli_query($query)) {
throw new Exception(mysqli_error($mysqli);
}
}
catch (Exception $e) {
echo $e -> getMessage();
}
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt