Rolf B: PHP Programmfehler - warum?

Beitrag lesen

Hallo Linuchs,

PHP-Vers.=[8.4.27] (seit wenigen Monaten, vorher jahrelang PHP 5)

Wenn $mysqli einen Fehler erzeugt, wird kein weiteres Kommando ausgeführt

Diese Info-Kombi brachte Klarheit. Sogar ohne KI 😉. Und Dir hätte was dämmern können, wenn Du anständiges Error-Logging durchführen würdest und in die Log-Datei geschaut hättest. Da müsste eine ungefangene SQL-Exception drinstehen.

Guck mal bei report_mode des mysqli Drivers. Da hat sich mit PHP 8.1 ein Default geändert. Es gibt durchaus Gründe, warum man sich die PHP Release Notes anschauen muss - da verbergen sich regelmäßig Tretminen.

Kurz gesagt: der report_mode war vor PHP 8.1 MYSQLI_REPORT_OFF und ist seitdem MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT. Das bedeutet, dass bei SQL-Fehlern eine Exception fliegt und das Script abbricht, wenn kein try/catch um die Query liegt. Das erklärt dann auch den HTTP 500.

Die aufwändige Lösung ist, jede SQL-Query in try/catch einzupacken und die mysqli_sql_exception sauber zu behandeln.

Die einfache Lösung wäre

mysqli_report(MYSQLI_REPORT_OFF);

damit hast Du das Verhalten vor PHP 8.1 und bekommst von mysqli_query ein FALSE zurück.

Statt OFF könntest Du aber auch

mysqli_report(MYSQLI_REPORT_INDEX | MYSQLI_REPORT_ERROR);

setzen, also nicht STRICT. Je nach Einstellungen im Error-Reporting bekommst Du dann Hinweise auf SQL-Fehler oder unpassende oder fehlende Indexe im Output oder in Error-Log zu sehen.

Diese Änderung in PHP 8.1 ist mal wieder typisch PHP: Seit PHP 8.0 steht in PDO das Attribut PDO::ATTR_ERRMODE auf PDO::ERRMODE_EXCEPTION, vorher war es PDO::ERRMODE_SILENT. Ein professionell aufgestelltes Team hätte diese Änderung in mysqli zeitgleich ausgerollt. Aber nein, sie haben es offenbar vergessen und schieben es eine Unterversion später nach. Das ist die Sprache, mit der ein Großteil des nichtstatichen Internets läuft 😢.

Rolf

--
sumpsi - posui - obstruxi