Bất cứ khi nào bạn nhận được ...
"Cảnh báo: mysqli_fetch_object () hy vọng tham số 1 sẽ là mysqli_result, được đưa ra boolean"
... có thể là do có vấn đề với truy vấn của bạn. Các prepare()
hoặc query()
trả lại sức mạnh FALSE
(một Boolean), nhưng thông báo lỗi chung chung này không để lại cho bạn nhiều trong cách manh mối. Làm thế nào để bạn tìm ra những gì là sai với truy vấn của bạn? Bạn hỏi !
Trước hết, hãy đảm bảo báo cáo lỗi được bật và hiển thị: thêm hai dòng này vào đầu (các) tệp của bạn ngay sau <?php
thẻ mở của bạn :
error_reporting(E_ALL);
ini_set('display_errors', 1);
Nếu báo cáo lỗi của bạn đã được đặt trong php.ini, bạn sẽ không phải lo lắng về điều này. Chỉ cần đảm bảo rằng bạn xử lý lỗi một cách duyên dáng và không bao giờ tiết lộ nguyên nhân thực sự của bất kỳ vấn đề nào cho người dùng của bạn. Tiết lộ nguyên nhân thực sự cho công chúng có thể là một lời mời khắc vàng cho những người muốn làm hại trang web và máy chủ của bạn. Nếu bạn không muốn gửi lỗi đến trình duyệt, bạn luôn có thể theo dõi nhật ký lỗi máy chủ web của mình. Vị trí nhật ký sẽ thay đổi từ máy chủ này sang máy chủ khác, ví dụ, trên Ubuntu, nhật ký lỗi thường được đặt tại /var/log/apache2/error.log
. Nếu bạn đang kiểm tra nhật ký lỗi trong môi trường Linux, bạn có thể sử dụngtail -f /path/to/log
trong cửa sổ bảng điều khiển để xem lỗi khi chúng xảy ra trong thời gian thực .... hoặc khi bạn tạo chúng.
Khi bạn bình phương về báo cáo lỗi tiêu chuẩn, việc thêm kiểm tra lỗi trên kết nối cơ sở dữ liệu của bạn và các truy vấn sẽ cung cấp cho bạn nhiều chi tiết hơn về các sự cố đang xảy ra. Hãy xem ví dụ này trong đó tên cột không chính xác. Đầu tiên, mã trả về thông báo lỗi nghiêm trọng chung:
$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();
Lỗi là chung chung và không hữu ích cho bạn trong việc giải quyết những gì đang xảy ra.
Với một vài dòng mã hơn, bạn có thể nhận được thông tin rất chi tiết mà bạn có thể sử dụng để giải quyết vấn đề ngay lập tức . Kiểm tra prepare()
tuyên bố về tính trung thực và nếu nó tốt, bạn có thể tiến hành ràng buộc và thực thi.
$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();
// any additional code you need would go here.
} else {
$error = $mysqli->errno . ' ' . $mysqli->error; // 1054 Unknown column 'foo' in 'field list'
// handle error
}
Nếu có gì đó không ổn, bạn có thể đưa ra một thông báo lỗi sẽ đưa bạn trực tiếp đến vấn đề. Trong trường hợp này, không có foo
cột trong bảng, giải quyết vấn đề là tầm thường.
Nếu bạn chọn, bạn có thể bao gồm kiểm tra này trong một chức năng hoặc lớp và mở rộng nó bằng cách xử lý các lỗi một cách duyên dáng như đã đề cập trước đó.