PHP 8.1 změnilo zpracování SQL chyb, ve striktním režimu nově vyvolá výjimku
Až do PHP 8.0 bylo nastaveno výchozí reportování chyb mysqli_report() na stav MYSQLI_REPORT_OFF. To se změnilo s příchodem PHP 8.1.0, kde je výchozí nastavení kombinace MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT. Autoři PHP se tak rozhodli kvůli tomu, že databázové chyby jsou častý problém, které ovlivňuje běh webových aplikací – nyní se tedy programátoři webů budou muset poprat se všemi chybami.
Rozdíl mezi nastavím lze popsat následovně:
MYSQLI_REPORT_OFF
- Kód: mysqli_report(MYSQLI_REPORT_OFF);
- Defaultní nastavení v PHP 8.0 a starší.
- Nepodporuje zpracování výjimek.
- SQL dotaz $result = mysqli_query(…) v případě SQL chyby vrátí stav, který si, pokud chcete, musíte sami odchytit a zpracovat v podmínce if (!$result) { … }. Pokud nic neuděláte, běh aplikace bude pokračovat.
MYSQLI_REPORT_ERROR
- Kód: mysqli_report(MYSQLI_REPORT_ERROR);
- Nepodporuje zpracování výjimek.
- SQL dotaz $result = mysqli_query(…) v případě SQL chyby automaticky vyvolá chybový stav E_WARNING v rámci PHP. Běh aplikace pokračuje.
- Chybový stav můžete zpracovat pomocí set_error_handler().
MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT
- Kód: mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
- Defaultní nastavení v PHP 8.1 a novější.
- Podporuje zpracování výjimek.
- Pokud v rámci try { … } odchytáváte výjimky při provádění SQL dotazu $result = mysqli_query(…), tak případnou vyvolanou výjimku (např. SQL chybu) můžete sami zpracovat v catch { … } a běh aplikace bude pokračovat.
- Pokud v rámci try { … } výjimky neodchytáváte, tak se automaticky zavolá chybový stav E_ERROR a běh aplikace se ukončí. Chybový stav můžete zpracovat pomocí register_shutdown_function().
Dále ještě existuje stav MYSQLI_REPORT_INDEX, který hlásí chybu nebo nepoužití indexu. Je součástí stavu MYSQLI_REPORT_ALL, který kombinuje MYSQLI_REPORT_ERROR a MYSQLI_REPORT_INDEX.