Hướng dẫn fix lỗi "mysqli_num_rows(): Argument #1 must be of type mysqli_result, bool given" trong PHP

Trước khi đi vào bài viết, mình muốn gửi đến các bạn lưu ý sau: Hàm mysql_num_rows() đã được loại bỏ và thay thế bằng mysqli_num_rows() kể từ phiên bản PHP 7.0.0, bên cạnh một số hàm khác có liên quan đến mysql như mysql_connect() → mysqli_connect(), mysql_select_db() → mysqli_select_db(), mysqli_query() → mysqli_query().  Về mặt cơ bản, chức năng của hàm thay thế được giữ nguyên, chỉ khác về mặt cú pháp và thứ tự tham số (parameter).

Bài viết này sẽ phân tích cùng một hiện tượng lỗi trên cả 2 phiên bản.

Hiện tượng lỗi

PHP không thể xử lý câu lệnh có sử dụng hàm mysqli_num_rows() (đối với phiên bản PHP >= 7.0.0)mysql_num_rows() (đối với phiên bản PHP < 7.0.0).

Lỗi hiển thị trên PHP >= 7.0.0

Fatal error: Uncaught TypeError: mysqli_num_rows(): Argument #1 ($...) must be of type mysqli_result, bool given in ...: mysqli_num_rows(false) #1 {main} thrown in ...
Fatal error: Uncaught TypeError: mysqli_num_rows(): Argument #1 ($...) must be of type mysqli_result, string given in ...: mysqli_num_rows(false) #1 {main} thrown in ...

Fatal error: Uncaught TypeError: mysqli_num_rows(): Argument #1 ($...) must be of type mysqli_result, bool given in ...: mysqli_num_rows(false) #1 {main} thrown in ...

Lỗi hiển thị trên PHP < 7.0.0

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in ...

Warning: mysql_num_rows() expects parameter 1 to be resource, string given in ...

Ý nghĩa lỗi

PHP Parser từ chối xử lý câu lệnh bởi tham số đầu tiên (paramerter 1 hoặc argument #1) truyền vào hàm mysqli_num_rows() (hoặc mysql_num_rows()) trong câu lệnh không đúng kiểu dữ liệu mà nó mong muốn.

  • Kiểu dữ liệu mong muốn: Data lấy từ cơ sở dữ liệu mysql (Dữ liệu trả về của hàm mysqli_query() hoặc mysql_query())
  • Kiểu dữ liệu bạn đang truyền vào: Boolean (true hoặc false) hoăc String

Nguyên nhân

1. Mysql từ chối xử lý query trong câu lệnh trước đó (vì một lý do nào đó như sai cú pháp, sai tên bảng, cột, lỗi kết nối...) dẫn đến tham số truyền vào là boolean thay vì mysql resource.

Ví dụ (PHP >= 7.0.0):

$con = mysqli_connect("localhost", "root", "");
$db_selected = mysqli_select_db($con, "test");
$result = mysqli_query("SELECT * FROM user"); // <-- Do viết sai tên bảng (tên đúng là users) nên kết quả xử lý là false
echo mysqli_num_rows($result); // <-- PHP Parser báo lỗi như đã nêu trên mục hiện tượng

Ví dụ (PHP < 7.0.0):

$con = mysql_connect("localhost", "root", "");
$db_selected = mysql_select_db("test", $con);
$result = mysql_query("SELECT * FROM user"); // <-- Do viết sai tên bảng (tên đúng là users) nên kết quả xử lý là false
echo mysql_num_rows($result); // <-- PHP Parser báo lỗi như đã nêu trên mục hiện tượng

2. Bạn "bê" nguyên query chưa được xử lý làm tham số truyền vào hàm mysqli_num_rows() (hoặc mysql_num_rows()) dẫn đến dữ liệu truyền vào thuộc kiểu string thay vì mysql resource.

Ví dụ (PHP >= 7.0.0):

$query = "SELECT * FROM user";
echo mysqli_num_rows($query); // Đúng phải là mysqli_num_rows(mysql_query($query));

Ví dụ (PHP < 7.0.0):

$query = "SELECT * FROM user";
echo mysql_num_rows($query); // Đúng phải là mysql_num_rows(mysql_query($query));

Cách khắc phục (Fix)

Bước 1. Kiểm tra xem bạn đã xử lý (run) query trước khi truyền tham số vào mysqli_num_rows() (hoặc mysql_num_rows())

Dấu hiệu cho thấy bạn đã xử lý query chính là hàm mysqli_query() (hoặc mysql_query()).

Trong trường hợp phát hiện bạn chưa thực hiện thao tác này, hãy bổ sung cho file code của mình.

Bước 2. Thử chạy query trong giao diện PHPMyadmin

Trong trường hợp kết quả xử lý của mysqli_query() (hoặc mysql_query()) thất bại, PHP parser sẽ không báo lỗi cụ thể (sai tên bảng, tên cột...). Chính vì thế bạn cần đăng nhập PHPMyadmin để thử chạy query để biết lỗi cụ thể.

Sau khi biết lỗi query nằm ở đâu, bạn hãy chỉnh lại query cho đúng trong file code của mình.

Bước 3. Chạy lại code sau khi đã thực hiện chỉnh sửa và lưu code

Đăng ký để nhận được thông báo mỗi khi có bài viết mới!