Umwandlung von Abfragefehlern in Exceptions in MySQLi [duplicate]

Lesezeit: 4 Minuten

Umwandlung von Abfragefehlern in Exceptions in MySQLi duplicate
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

Umwandlung von Abfragefehlern in Exceptions in MySQLi duplicate
Ihr gesunder Menschenverstand

Vor einiger Zeit habe ich es geschafft, diese Angelegenheit zu klären. Wie in der anderen Antwort darauf hingewiesen wurde,

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

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

Umwandlung von Abfragefehlern in Exceptions in MySQLi duplicate
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_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)

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

993260cookie-checkUmwandlung von Abfragefehlern in Exceptions in MySQLi [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy