在使用 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 应用程序非常关键。