当前位置: 首页> 最新文章列表> stmt_init 如何与 num_rows 或 affected_rows 配合获取结果影响

stmt_init 如何与 num_rows 或 affected_rows 配合获取结果影响

M66 2025-05-29

在使用 PHP 的 MySQLi 扩展进行数据库操作时,mysqli::stmt_init() 是一个重要的方法,它用于初始化一个语句对象(mysqli_stmt),进而可以准备执行 SQL 语句。为了确定查询语句是否有结果返回,或者有多少行受到影响,可以结合使用 num_rows(针对 SELECT 语句)或 affected_rows(针对 INSERTUPDATEDELETE)。

本文将通过示例说明如何使用 mysqli::stmt_init() 并结合 num_rowsaffected_rows 来获取查询结果的影响。

一、准备工作:数据库连接

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

// 检查连接
if ($mysqli->connect_error) {
    die("连接失败: " . $mysqli->connect_error);
}
?>

二、使用 stmt_init 初始化语句并准备查询

$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;
}

三、使用 affected_rows 获取更新、插入或删除影响的行数

$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;
}

四、注意事项

  1. 使用 num_rows 时,必须调用 store_result() 否则它将始终返回 0。

  2. affected_rows 可以直接读取,不需要调用 store_result()

  3. 在使用完语句对象后,请记得调用 $stmt->close() 释放资源。

  4. 如需调试或查看错误信息,可使用 $stmt->error$mysqli->error

五、结语

通过合理使用 mysqli::stmt_init() 并结合 num_rowsaffected_rows,我们可以更加高效地管理数据库查询的反馈与结果处理。这对于开发稳定且性能优良的 PHP 应用程序非常关键。