Come fare mysqli lanciare eccezioni usando MYSQLI_REPORT_STRICT?

C'è una function in mysqli, chiamata mysqli_report() , che assomiglia a una controparte per il metodo setAttribute() di PDO con le sue costanti ERRMODE_* . Il manuale dice :

MYSQLI_REPORT_STRICT Manda Throw mysqli_sql_exception for errors instead of warnings

Quindi, avendo in mente PDO::ERRMODE_EXCEPTION , ho provato questo codice

 mysqli_report(MYSQLI_REPORT_STRICT); $mysqli->query("foo"); 

ma, con mia grande delusione, non ha prodotto alcuna exception né alcun avvertimento.

Quindi, ecco la domanda: c'è un modo per dire a mysqli di lanciare eccezioni senza usare MYSQLI_REPORT_ALL ?

Non è un bug, questa è una caratteristica. 😉

PHP non segnala gli errori mysqli o PDO di default perché tali informazioni sono altamente sensibili, visualizzarle a un utente è un ottimo modo per imparare a iniettare dati dannosi.

MYSQLI_REPORT_ERROR dice di triggersre gli errori e MYSQLI_REPORT_STRICT gli dice di convertire quegli errori in Eccezioni. Questo ti darà un rapporto completo del messaggio di errore, quindi non farlo mai negli ambienti di produzione.

Usando il simbolo Pipe | consente di impostare più costanti nella maggior parte dei methods e delle funzioni di PHP. PDO, mysqli, filter_var, ecc. Usano tutti la pipe per impostare più argomenti opzionali dello stesso tipo, o una "disgiunzione bitwise di flag" per usare il termine di fantasia per esso. Argomento dell'arrays della persona pigra.

Dopo alcune ricerche ho finalmente appreso che il parametro della function è una maschera di bit e che è necessario combinare più valori per get il risultato desiderato. La combinazione finale non è eccessivamente logica, ma funziona come previsto, generando un'exception su un errore di query ignorando gli avvisi.

 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

produrrà il risultato desiderato:

Errore irreversibile: exception non rilevata "mysqli_sql_exception" con messaggio "Si è verificato un errore nella syntax SQL; controlla il manuale che corrisponde alla tua versione del server MySQL per la syntax corretta da usare vicino a 'foo' alla row 1 '