PHP Programmfehler - warum?
bearbeitet vonHallo 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 😉
Guck mal bei [report_mode](https://www.php.net/manual/en/mysqli-driver.report-mode.php) 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](https://www.php.net/manual/en/class.mysqli-sql-exception.php) sauber zu behandeln.
Die einfache Lösung wäre
~~~php
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
~~~php
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