在PHP 中,使用MySQLi 擴展查詢數據庫時,很多開發者會遇到一個令人困惑的問題: 這到底是怎麼回事?本文將帶你梳理常見的誤區,幫你找出問題的根源。
mysqli_multi_query是一次可以執行多條SQL 語句的方法,但它返回的是一個布爾值,真正的結果集要通過mysqli_store_result或mysqli_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;
?>
如果跳過execute或get_result , num_rows根本無從談起。
默認情況下,MySQLi 使用緩衝查詢,可以直接用num_rows 。但如果用MYSQLI_USE_RESULT模式,結果集是流式的,MySQL 無法在未遍歷前計算總行數。
示例:
<?php
$result = $mysqli->query("SELECT * FROM users", MYSQLI_USE_RESULT);
echo $result->num_rows; // 錯誤:此时无法获取行數
解決方法是使用默認的緩沖模式或自己遍歷統計。
很多人誤以為num_rows可以用在INSERT 、 UPDATE 、 DELETE查詢上。其實這些操作沒有結果集,應該用$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後忘了execute和get_result ?
? 是不是用了UNBUFFERED模式?
? 是不是搞錯了查詢類型?
避免這些誤區,就能正確使用mysqli_result和num_rows ,少走彎路。