當前位置: 首頁> 最新文章列表> 為什麼num_rows 返回的是0?常見誤區解析

為什麼num_rows 返回的是0?常見誤區解析

M66 2025-05-31

在PHP 中,使用MySQLi 擴展查詢數據庫時,很多開發者會遇到一個令人困惑的問題: 這到底是怎麼回事?本文將帶你梳理常見的誤區,幫你找出問題的根源。

誤區一:使用了mysqli_multi_query

mysqli_multi_query是一次可以執行多條SQL 語句的方法,但它返回的是一個布爾值,真正的結果集要通過mysqli_store_resultmysqli_use_result來獲取。

示例代碼:

 <?php
$mysqli = new mysqli("localhost", "user", "password", "database");

$sql = "SELECT * FROM users; SELECT * FROM products;";
if ($mysqli->multi_query($sql)) {
    do {
        if ($result = $mysqli->store_result()) {
            echo "當前結果集行數: " . $result->num_rows . "<br>";
            $result->free();
        }
    } while ($mysqli->more_results() && $mysqli->next_result());
}
?>

如果直接嘗試用multi_query返回值調用num_rows ,當然會得到0。確保你正確獲取結果集對象。

誤區二:忘記執行查詢

有些開發者寫了$stmt = $mysqli->prepare(...) ,然後直接用$stmt->num_rows ,但注意: prepare並不會執行查詢,只是準備。

必須先執行查詢並獲取結果:

 <?php
$stmt = $mysqli->prepare("SELECT * FROM users WHERE age > ?");
$stmt->bind_param("i", $age);
$age = 18;
$stmt->execute();
$result = $stmt->get_result();
echo "行數: " . $result->num_rows;
?>

如果跳過executeget_resultnum_rows根本無從談起。

誤區三:使用了UNBUFFERED查詢

默認情況下,MySQLi 使用緩衝查詢,可以直接用num_rows 。但如果用MYSQLI_USE_RESULT模式,結果集是流式的,MySQL 無法在未遍歷前計算總行數。

示例:

 <?php
$result = $mysqli->query("SELECT * FROM users", MYSQLI_USE_RESULT);
echo $result->num_rows; // 錯誤:此时无法获取行數

解決方法是使用默認的緩沖模式或自己遍歷統計。

誤區四:誤解num_rows的含義

很多人誤以為num_rows可以用在INSERTUPDATEDELETE查詢上。其實這些操作沒有結果集,應該用$mysqli->affected_rows

 <?php
$mysqli->query("UPDATE users SET status = 'active' WHERE last_login > NOW() - INTERVAL 30 DAY");
echo "受影响的行數: " . $mysqli->affected_rows;
?>

記住:只有SELECT 查詢產生的結果集才有num_rows

小結

如果你遇到num_rows總是返回0,先檢查:

? 是不是用的multi_query卻沒取到結果集?
? 是不是prepare後忘了executeget_result
? 是不是用了UNBUFFERED模式?
? 是不是搞錯了查詢類型?

避免這些誤區,就能正確使用mysqli_resultnum_rows ,少走彎路。