当前位置: 首页> 最新文章列表> stmt_init 与 fetch() 的配合使用详解

stmt_init 与 fetch() 的配合使用详解

M66 2025-05-16

在使用 PHP 操作 MySQL 数据库时,mysqli 扩展提供了面向对象的接口,让我们可以更安全、结构化地执行 SQL 语句。特别是在执行预处理语句(Prepared Statements)时,mysqli::stmt_initfetch() 是两个非常关键的函数。

本文将详细介绍如何使用 mysqli::stmt_init() 初始化语句对象,并结合 fetch() 方法安全高效地获取数据库中的数据。

一、什么是 mysqli::stmt_init

mysqli::stmt_init()mysqli 类的方法,用于初始化一个语句对象(mysqli_stmt)。这个对象随后可以通过 prepare() 方法准备 SQL 语句。这样做的好处是可以复用语句并绑定参数,提高代码的安全性与效率。

示例:

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

if ($mysqli->connect_errno) {
    die("连接失败: " . $mysqli->connect_error);
}

$stmt = $mysqli->stmt_init();

二、准备和执行 SQL 语句

使用 stmt_init() 创建语句对象后,使用 prepare() 准备查询语句,并使用 bind_param() 绑定参数。

$query = "SELECT id, name, email FROM users WHERE status = ?";
if ($stmt->prepare($query)) {
    $status = 'active';
    $stmt->bind_param("s", $status);
    $stmt->execute();
}

提示:bind_param 的第一个参数 "s" 表示参数类型是字符串(string)。

三、绑定结果并使用 fetch() 提取数据

执行语句后,我们需要使用 bind_result() 将查询结果的列绑定到变量上,随后可以使用 fetch() 方法一行一行地提取数据。

$stmt->bind_result($id, $name, $email);

while ($stmt->fetch()) {
    echo "用户ID: $id<br>";
    echo "用户名: $name<br>";
    echo "邮箱: $email<br><br>";
}

四、完整示例

以下是一个完整的 PHP 示例程序:

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

if ($mysqli->connect_errno) {
    die("连接失败: " . $mysqli->connect_error);
}

$stmt = $mysqli->stmt_init();
$query = "SELECT id, name, email FROM users WHERE status = ?";

if ($stmt->prepare($query)) {
    $status = 'active';
    $stmt->bind_param("s", $status);
    $stmt->execute();
    $stmt->bind_result($id, $name, $email);

    echo "<h2>活跃用户列表:</h2>";
    while ($stmt->fetch()) {
        echo "<div>";
        echo "<strong>ID:</strong> $id<br>";
        echo "<strong>姓名:</strong> $name<br>";
        echo "<strong>邮箱:</strong> <a href='mailto:$email'>$email</a><br>";
        echo "<a href='https://m66.net/user/profile.php?id=$id'>查看详情</a>";
        echo "</div><hr>";
    }

    $stmt->close();
} else {
    echo "SQL 预处理失败: " . $stmt->error;
}

$mysqli->close();
?>