2013-08-27 11 views
5

W mysqli znajduje się funkcja o nazwie mysqli_report(), która wygląda jak odpowiednik dla metody PDO o setAttribute() ze stałymi ERRMODE_*. Instrukcja says:Jak tworzyć wyjątki w mysqli za pomocą MYSQLI_REPORT_STRICT?

MYSQLI_REPORT_STRICTThrow mysqli_sql_exception for errors instead of warnings

Zatem, mając na uwadze PDO::ERRMODE_EXCEPTION, próbowałem ten kod

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

ale, ku mojemu rozczarowaniu, wyprodukowany bez wyjątku ostrzeżenia ani w ogóle.

Tak, oto pytanie: czy istnieje sposób, aby powiedzieć mysqli, aby wyrzucać wyjątki bez używania MYSQLI_REPORT_ALL?

Odpowiedz

11

Po kilku badaniach w końcu dowiedziałem się, że parametr funkcji jest maską bitową i trzeba połączyć kilka wartości, aby uzyskać pożądany wynik. Ostatnia kombinacja nie jest zbyt logiczna, ale działa tak, jak powinna, rzucając wyjątek na błąd zapytania, ignorując ostrzeżenia.

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

przyniesie pożądanego rezultatu:

Fatal error: Uncaught exception 'mysqli_sql_exception' with message 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'foo' at line 1'

+0

Co to za "błąd PHP" - nie zawiera żadnych użytecznych informacji? – MrWhite

9

To nie jest błąd, to funkcja. ;)

PHP domyślnie nie zgłasza błędów mysqli lub PDO, ponieważ informacje te są bardzo wrażliwe, wyświetlanie ich użytkownikowi jest świetnym sposobem na nauczenie się, jak wstrzykiwać złośliwe dane.

MYSQLI_REPORT_ERROR mówi, aby włączyć błędy i MYSQLI_REPORT_STRICT mówi, aby przekonwertować te błędy do wyjątków. Da to pełny raport o błędzie, więc nigdy nie rób tego w środowiskach produkcyjnych.

Korzystanie z symbolu rury | pozwala ustawić wiele stałych w większości metod i funkcji PHP. PDO, mysqli, filter_var, itp. Wszystkie używają potoku do ustawienia wielu opcjonalnych argumentów tego samego typu lub "bitowego rozłączenia flag", aby użyć do tego odpowiedniego terminu. Argument tablicowy leniwej osoby.

Powiązane problemy