Hauptmenü

Untermenü

MySQLi - Fehlerbehandlung - Feinheiten

1. Vorsicht bei Prepared Statements

Denn wenn dort das SQL-Statement einen Fehler aufweist, dann haut es euch beim bind_params folgende Meldung um die Ohren.


Fatal errorCall to a member function bind_param() 
             on a non-object in ....

Man sollte also niemals so vorgehen.


// Objektorientiert
$mysqli = new mysqli('host''user''pw''dbi');
$query  'SELECT bla FROM blubb WHERE id ?';
$stmt   $mysqli -> prepare ($query);
$id     1;
$stmt  -> bind_param('i'$id);

// Prozedural
$mysqli mysqli_connect('host''user''pw''dbi');
$query  'SELECT bla FROM blubb WHERE id ?';
$stmt   mysqli_prepare($mysqli$query);
$id     1;
mysqli_stmt_bind_param($stmt'i'$id);

Na? Den Fehler gefunden? Kommen wir nun zum Grundsätzlichen. Wenn prepare erfolgreich ausgeführt worden ist, so erhält man als Rückgabewert ein Objekt. Dabei ist es egal, ob man objektorientiert oder prozedural arbeitet. Die Feinheiten dazu kommen gleich. Ist aber die Abfrage fehlerhaft, so bekommt man nichts. Oder genauer gesagt ein false.

2. Der korrekte Weg

Man arbeitet einfach mit einer if-Bedingung.


// Objektorientiert
if ($stmt   $mysqli -> prepare ($query))
{
  $id     1;
  $stmt  -> bind_param('i'$id);
  $stmt  -> execute();
}
else {
  echo $mysqli -> error;
}

// Prozedural
if ($stmt mysqli_prepare ($mysqli$query))
{
  $id     1;
  mysqli_stmt_bind_param($stmt'i'$id);
  mysqli_stmt_execute($stmt);
}
else {
  echo $mysqli -> error;
}

Anstelle des einfachen if käme auch ein try catch Block in Frage. Aber selbst da benötigt man für das throw eine Bedingung.

3. Ein wichtiger Hinweis

Dasselbe Problem gibt es auch bei der Verwendung von Multi-Queries. Darum sollte man auch in diesem Fall mit if-Bedingungen und optional zusätzlich mit einem try catch Block arbeiten.

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