在使用PHP 的MySQLi 擴展進行數據庫操作時, mysqli::stmt_init()是一個重要的方法,它用於初始化一個語句對象( mysqli_stmt ),進而可以準備執行SQL 語句。為了確定查詢語句是否有結果返回,或者有多少行受到影響,可以結合使用num_rows (針對SELECT語句)或affected_rows (針對INSERT 、 UPDATE或DELETE )。
本文將通過示例說明如何使用mysqli::stmt_init()並結合num_rows和affected_rows來獲取查詢結果的影響。
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
// 檢查連接
if ($mysqli->connect_error) {
die("連接失敗: " . $mysqli->connect_error);
}
?>
$stmt = $mysqli->stmt_init();
$sql = "SELECT id, name FROM users WHERE status = ?";
if ($stmt->prepare($sql)) {
$status = 'active';
$stmt->bind_param("s", $status);
$stmt->execute();
$stmt->store_result(); // 這一步是必須的,否則 num_rows 將總是返回 0
echo "返回的行數:" . $stmt->num_rows . "<br>";
if ($stmt->num_rows > 0) {
$stmt->bind_result($id, $name);
while ($stmt->fetch()) {
echo "用戶ID: $id, 姓名: $name<br>";
}
} else {
echo "沒有符合條件的記錄。";
}
$stmt->close();
} else {
echo "預處理失敗:" . $stmt->error;
}
$stmt = $mysqli->stmt_init();
$sql = "UPDATE users SET status = ? WHERE last_login < ?";
if ($stmt->prepare($sql)) {
$new_status = 'inactive';
$cutoff_date = '2024-01-01';
$stmt->bind_param("ss", $new_status, $cutoff_date);
$stmt->execute();
echo "受影響的行數:" . $stmt->affected_rows;
$stmt->close();
} else {
echo "預處理失敗:" . $stmt->error;
}
使用num_rows時,必須調用store_result()否則它將始終返回0。
affected_rows可以直接讀取,不需要調用store_result() 。
在使用完語句對像後,請記得調用$stmt->close()釋放資源。
如需調試或查看錯誤信息,可使用$stmt->error或$mysqli->error 。
通過合理使用mysqli::stmt_init()並結合num_rows和affected_rows ,我們可以更加高效地管理數據庫查詢的反饋與結果處理。這對於開發穩定且性能優良的PHP 應用程序非常關鍵。