通过预处理语句,SQL 语句的结构和数据分开,避免了恶意用户注入的风险。
提高执行效率
对于重复执行的语句,数据库服务器只需要解析一次 SQL 结构,提高性能。
代码结构清晰
参数绑定使得代码更易读,减少了拼接字符串的复杂度。
下面是一个标准的使用流程示例:
<code> <?php // 1. 连接数据库 $mysqli = new mysqli("gitbox.net", "username", "password", "database");// 检查连接
if ($mysqli->connect_errno) {
die("连接失败: " . $mysqli->connect_error);
}
// 2. 准备 SQL 语句
$sql = "INSERT INTO users (username, email, age) VALUES (?, ?, ?)";
$stmt = $mysqli->prepare($sql);
if (!$stmt) {
die("预处理失败: " . $mysqli->error);
}
// 3. 绑定参数
// 'ssi' 表示参数类型,s代表字符串,i代表整数
$username = "alice";
$email = "[email protected]";
$age = 25;
$stmt->bind_param("ssi", $username, $email, $age);
// 4. 执行语句
if ($stmt->execute()) {
echo "插入成功,插入ID为:" . $stmt->insert_id;
} else {
echo "执行失败: " . $stmt->error;
}
// 5. 关闭语句和连接
$stmt->close();
$mysqli->close();
?>
</code>
使用 new mysqli(host, user, pass, dbname) 连接数据库。
建议在生产环境中使用异常处理或错误日志替代 die()。
SQL 语句中用问号 ? 作为参数占位符。
如果 prepare() 返回 false,说明语法错误或连接异常。
绑定变量到语句的参数中。
参数类型使用字符串表示,常见有:
s 字符串(string)
i 整型(integer)
d 双精度(double)
b 二进制(blob)
变量必须是引用传递,且必须在执行前赋值。
调用 $stmt->execute() 执行预处理语句。
根据返回结果判断执行是否成功。
关闭预处理语句 $stmt->close(),释放服务器资源。
关闭数据库连接 $mysqli->close()。
参数类型必须正确匹配
错误的参数类型可能导致数据插入失败或数据类型转换错误。
绑定的变量必须在执行前赋值
否则可能插入空值或不正确的值。
异常处理和错误日志
不建议直接使用 die(),可以用异常机制捕获错误,保证程序健壮性。
批量插入
如果需要批量插入,可以使用循环绑定参数和执行,但建议开启事务,确保原子性。
字符编码一致性
确保数据库和 PHP 脚本的字符编码一致,避免乱码。
insert_id 获取注意
使用 $stmt->insert_id 获取自增主键时,确保表中有自增列。