Hauptmenü

Untermenü

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