Umwandlung von Abfragefehlern in Exceptions in MySQLi [duplicate]
Lesezeit: 4 Minuten
Roman Newaza
Ich versuche, MySQLi-Abfragefehler in Ausnahmen umzuwandeln, konnte aber nicht – mysqli_sql_exception wird nur ausgelöst, wenn keine Verbindung zur DB hergestellt werden konnte.
ich benutzte mysqli_report(MYSQLI_REPORT_STRICT) und prozedurale MySQLi-Funktionen, die in eine benutzerdefinierte Wrapper-Klasse eingebettet sind.
Ehemaliger Code:
public function mysqlQuery($SQL) {
$this->Result = mysqli_query($this->DBlink, $SQL);
if($this->Result === false)
throw new MySQLiQueryException($SQL, mysqli_error($this->DBlink), mysqli_errno($this->DBlink));
return $this->Result;
}
Frage: Ist es normal, dass keine Warnung oder Ausnahme ausgelöst wird, wenn die Abfrage fehlschlägt, sodass ich prüfen muss, ob mysqli_query() false zurückgegeben hat?
Soweit ich weiß, löst mysqli nur eine Ausnahme nur bei DB-Verbindung aus. Also … ziemlich genau, ja. Sie haben mysqli_errno, mysqli_error und andere Funktionen, damit Sie den Fehler kennen, aber das ist die Grenze.
– Vlad Preda
29. Januar 2013 um 8:12 Uhr
Sie können Ausnahmen auslösen, wenn mit just etwas schief geht try, catch, throw
– k102
29. Januar 2013 um 8:14 Uhr
@ k102, ich habe versucht, diesen Teil aus meinem Code in MySQLi zu übertragen.
– Roman Newaza
29. Januar 2013 um 8:32 Uhr
@VladPreda Ich verstehe, es sieht so aus, als müsste ich es so lassen, wie es jetzt ist.
– Roman Newaza
29. Januar 2013 um 8:44 Uhr
Ihr gesunder Menschenverstand
Vor einiger Zeit habe ich es geschafft, diese Angelegenheit zu klären. Wie in der anderen Antwort darauf hingewiesen wurde,
ist ein korrekter Weg, mysqli anzuweisen, Ausnahmen auszulösen.
Stellen Sie einfach sicher, dass Sie Wickeln Sie nicht jede Abfrage in einen Try-Catch ein. Dies ist ein weit verbreitetes Missverständnis, dass Sie, sobald Sie mit der Verwendung von Ausnahmen begonnen haben, anfangen sollten, Versuche und Fänge nach links und rechts zu werfen. Ganz im Gegenteil, try-catch sollte vorsichtig verwendet werden. Während 99 % Ihrer Fehler nicht direkt behandelt werden sollten, sondern von einem seitenweiten Fehlerbehandler. Sie können mehr über das Thema von meinem Artikel lesen PHP-Fehlerberichterstattung
So ist es jetzt. Ich frage, ob es möglich ist, den MySQLi-Treiber anzuweisen, Ausnahmen auszulösen, genau wie bei PDO.
– Roman Newaza
29. Januar 2013 um 8:38 Uhr
Ja, deine Frage ist klar. Aber es ist (eine sehr) gute Praxis, eine Wrapper-Funktion zum Ausführen von Abfragen zu verwenden, sobald Sie diese haben, ist es trivial, diese zusätzlichen zwei Zeilen hinzuzufügen.
– Karoly Horvath
29. Januar 2013 um 8:42 Uhr
Der Link für den PHP-Fehler ist stattdessen down Das
– Simone Rossaini
20. Mai 2021 um 9:16 Uhr
Herr weiß
muss ich prüfen, ob mysqli_query() false zurückgegeben hat?
Nein.
Sie sollten in der Lage sein, das zu tun, was Sie benötigen, und den mysqli-Treiber anweisen, Ausnahmen bei SQL-Fehlern auszulösen, aber Sie müssen ihn aktivieren MYSQLI_REPORT_ERROR wenn es das nicht schon ist….
mysqli_query() sollte jetzt Ausnahmen bei Fehlern auslösen. Sie müssen den Rückgabewert nicht auf Fehler überprüfen (was sowieso nicht passieren wird, da eine Ausnahme ausgelöst wird).
public function mysqlQuery($SQL) {
try {
$this->Result = mysqli_query($this->DBlink, $SQL);
} catch (mysqli_sql_exception $e) {
throw new MySQLiQueryException($SQL, $e->getMessage(), $e->getCode());
}
return $this->Result;
}
(NB: Ich habe mich geändert $this->SQL zu $SQL in der erneut ausgelösten Ausnahme.)
Ist es die Tatsache, dass Sie mysqli_sql_exception verwenden, die die Verwendung der Methode $e->getCode() erlaubt, und das wird die $mysqli->errno widerspiegeln, denke ich?
– Louis Loudog Trottier
12. Mai 2017 um 5:18 Uhr
@LouisLoudogTrottier Ja, getCode() ist eine Methode der mysqli_sql_exception -Objekt, ist also nur im Gültigkeitsbereich des Catch-Blocks dieses Ausnahmetyps verfügbar.
– Herr weiß
12. Mai 2017 um 9:07 Uhr
Ich weiß, es ist ein bisschen zu spät, aber der Nachwelt zuliebe. Ich finde MYSQLI_REPORT_STRICT zu restriktiv, bestimmte Ausnahmen wurden nicht ausgelöst und konnten daher nicht vom catch-Block behandelt werden.
mysqli_report(MYSQLI_REPORT_ALL); // Traps all mysqli error
try {
$mysqli = new mysqli('localhost','user,'pwd','db');
/* I don't need to explicitly throw an exception as this is being
done automatically */
} catch(Exception $e) {
echo $e->getMessage();
}
Exception $e wird mysqli-Fehler von selbst abfangen oder müssen wir verwenden mysqli_sql_exception $e? oder sind sie gleichwertig? oder wird wegen mysqli_report(MYSQLI_REPORT_ALL);` eine Ausnahme verwendet?
– Louis Loudog Trottier
12. Mai 2017 um 5:16 Uhr
@LouisLogTrottier Exception Objekt ist das übergeordnete Objekt aller Ausnahmen (mysqli_sql_exception ist eine Unterklasse), also wird es natürlich abfangen alles.
– Herr weiß
12. Mai 2017 um 9:14 Uhr
catch(Exception $e) { echo $e->getMessage(); ist ein nutzloser Cargo-Kult-Code. Wenn Sie es herausnehmen, wird das Ergebnis sein das Gleiche: PHP meldet bereits nicht erfasste Ausnahmen.
– Ihr gesunder Menschenverstand
5. Mai 2020 um 10:11 Uhr
9932600cookie-checkUmwandlung von Abfragefehlern in Exceptions in MySQLi [duplicate]yes
Soweit ich weiß, löst mysqli nur eine Ausnahme nur bei DB-Verbindung aus. Also … ziemlich genau, ja. Sie haben mysqli_errno, mysqli_error und andere Funktionen, damit Sie den Fehler kennen, aber das ist die Grenze.
– Vlad Preda
29. Januar 2013 um 8:12 Uhr
Sie können Ausnahmen auslösen, wenn mit just etwas schief geht
try, catch, throw
– k102
29. Januar 2013 um 8:14 Uhr
@ k102, ich habe versucht, diesen Teil aus meinem Code in MySQLi zu übertragen.
– Roman Newaza
29. Januar 2013 um 8:32 Uhr
@VladPreda Ich verstehe, es sieht so aus, als müsste ich es so lassen, wie es jetzt ist.
– Roman Newaza
29. Januar 2013 um 8:44 Uhr