mysqli预处理语句是PHP中与MySQL数据库交互的重要安全机制,它通过将SQL语句结构与数据分离来提升性能和安全性。
核心优势
安全性:有效防止SQL注入攻击,参数值会被自动转义处理
性能:语句只需编译一次,可重复执行,减少解析开销
可维护性:代码结构更清晰,易于理解和修改
基本使用流程
创建连接:建立与MySQL数据库的连接
准备语句:使用
prepare()方法创建预处理语句绑定参数:使用
bind_param()绑定参数执行查询:调用
execute()方法执行语句处理结果:获取并处理查询结果
关闭资源:释放语句和连接资源
参数绑定类型
bind_param()方法的第一个参数指定参数类型:
i:整数d:双精度浮点数s:字符串b:二进制数据(如BLOB)
常见操作示例
1. 查询操作
$stmt = $conn->prepare("SELECT id, name FROM users WHERE email = ?");
$stmt->bind_param("s", $email);
$email = "user@example.com";
$stmt->execute();
$stmt->bind_result($id, $name);
while ($stmt->fetch()) {
echo "ID: $id, Name: $name";
}2. 插入操作
$stmt = $conn->prepare("INSERT INTO products (name, price) VALUES (?, ?)");
$stmt->bind_param("sd", $name, $price);
$name = "New Product";
$price = 19.99;
$stmt->execute();
echo "插入了".$stmt->affected_rows."行记录";3. 更新操作
$stmt = $conn->prepare("UPDATE orders SET status = ? WHERE id = ?");
$stmt->bind_param("si", $status, $orderId);
$status = "shipped";
$orderId = 123;
$stmt->execute();高级用法
批量执行:通过改变绑定参数值重复执行同一预处理语句
事务处理:结合事务确保数据一致性
存储过程:调用数据库存储过程
结果集元数据:获取结果集的列信息
错误处理
建议在执行每个步骤后检查错误:
if (!$stmt = $conn->prepare($sql)) {
die("准备语句失败: ".$conn->error);
}
if (!$stmt->execute()) {
die("执行失败: ".$stmt->error);
}预处理语句特别适合需要频繁执行相同SQL结构但参数不同的场景,如用户认证、数据批量操作等。