在使用 PHP 操作 MySQL 数据库时,mysqli 扩展提供了丰富的预处理语句(Prepared Statements)支持,可以有效防止 SQL 注入攻击,并提高数据库操作的安全性和效率。本文将重点介绍如何使用 mysqli::stmt_init 方法初始化一个语句对象,并通过该对象执行 SQL 语句。
mysqli::stmt_init() 是 mysqli 类的一个方法,用于初始化一个空的语句对象(mysqli_stmt)。这个对象后续可以通过调用 prepare() 方法绑定 SQL 查询语句,并进一步调用 bind_param()、execute() 等方法进行操作。
其基本语法如下:
$stmt = $mysqli->stmt_init();
其中 $mysqli 是一个已经连接到数据库的 mysqli 对象。
以下是一个使用 stmt_init 初始化语句并执行 SQL 查询的完整 PHP 示例:
<?php
// 数据库连接
$mysqli = new mysqli("localhost", "username", "password", "database");
// 检查连接
if ($mysqli->connect_error) {
die("连接失败: " . $mysqli->connect_error);
}
// 初始化语句对象
$stmt = $mysqli->stmt_init();
// 预处理 SQL 语句
if ($stmt->prepare("SELECT name, email FROM users WHERE id = ?")) {
// 绑定参数
$id = 1;
$stmt->bind_param("i", $id);
// 执行语句
$stmt->execute();
// 绑定结果变量
$stmt->bind_result($name, $email);
// 获取查询结果
while ($stmt->fetch()) {
echo "用户姓名: $name, 邮箱: $email<br>";
}
// 关闭语句
$stmt->close();
} else {
echo "SQL 预处理失败: " . $stmt->error;
}
// 关闭连接
$mysqli->close();
?>
在调用 stmt_init() 后,你必须使用 prepare() 方法才能实际绑定 SQL 语句。
bind_param() 中的类型参数例如 "i" 表示整型,"s" 表示字符串,必须正确设置。
一定要在使用完语句对象后调用 $stmt->close() 以释放资源。
虽然可以直接使用 $mysqli->prepare() 来进行语句准备,stmt_init() 提供了更细致的控制,比如在需要检查语句是否可复用或使用低级接口时更有用。