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 error: Call 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