2013-08-27 27 views
5

Có một hàm trong mysqli, được gọi là mysqli_report(), trông giống như một đối tác của phương thức setAttribute() của PDO với hằng số ERRMODE_* của nó. Hướng dẫn says:Làm thế nào để làm cho trường hợp ngoại lệ ném mysqli bằng MYSQLI_REPORT_STRICT?

MYSQLI_REPORT_STRICTThrow mysqli_sql_exception for errors instead of warnings

Vì vậy, có PDO::ERRMODE_EXCEPTION trong tâm trí, tôi đã cố gắng mã này

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

nhưng, để sự thất vọng của tôi, nó được sản xuất không phải ngoại lệ cũng không cảnh báo gì cả.

Vì vậy, ở đây đi câu hỏi: có cách nào để nói mysqli để ném ngoại lệ mà không sử dụng MYSQLI_REPORT_ALL?

Trả lời

11

Sau khi một số nghiên cứu cuối cùng tôi đã học được rằng tham số của hàm là một bitmask, và ta phải kết hợp một vài giá trị để có được kết quả mong muốn. Sự kết hợp cuối cùng không quá logic, nhưng nó hoạt động như dự định, ném một ngoại lệ trên một lỗi truy vấn trong khi bỏ qua các cảnh báo.

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

sẽ tạo ra kết quả mong muốn:

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

"Lỗi PHP" là gì - nó dường như không chứa bất kỳ thông tin hữu ích nào? – MrWhite

9

Đó không phải là một lỗi, đó là một tính năng. ;)

PHP không báo cáo lỗi mysqli hoặc PDO theo mặc định vì thông tin đó rất nhạy cảm, hiển thị nó cho người dùng là cách tuyệt vời để tìm hiểu cách chèn dữ liệu độc hại.

MYSQLI_REPORT_ERROR yêu cầu nó bật các lỗi và MYSQLI_REPORT_STRICT yêu cầu chuyển đổi các lỗi đó thành Ngoại lệ. Điều này sẽ cung cấp cho bạn một báo cáo đầy đủ về thông báo lỗi, vì vậy không bao giờ làm điều này trong môi trường sản xuất.

Sử dụng ký hiệu Ống | cho phép bạn thiết lập nhiều hằng số trong hầu hết các phương thức và hàm của PHP. PDO, mysqli, filter_var, v.v. tất cả đều sử dụng đường ống để đặt nhiều đối số tùy chọn cùng loại hoặc "phân tách bit cờ" để sử dụng thuật ngữ ưa thích cho nó. Đối số mảng của người lười biếng.

Các vấn đề liên quan