在使用 PHP 操作 MySQL 数据库时,mysqli 扩展提供了面向对象的接口,让我们可以更安全、结构化地执行 SQL 语句。特别是在执行预处理语句(Prepared Statements)时,mysqli::stmt_init 和 fetch() 是两个非常关键的函数。
本文将详细介绍如何使用 mysqli::stmt_init() 初始化语句对象,并结合 fetch() 方法安全高效地获取数据库中的数据。
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();
使用 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)。
执行语句后,我们需要使用 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();
?>