php实现更新
使用PDO预处理语句更新数据
创建PDO连接后,使用预处理语句防止SQL注入。绑定参数时明确指定数据类型,提高安全性。
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$stmt = $pdo->prepare("UPDATE users SET email = :email WHERE id = :id");
$stmt->bindParam(':email', $email, PDO::PARAM_STR);
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();
使用MySQLi面向对象方式更新
通过MySQLi对象调用预处理方法,对整数型ID使用i类型绑定,字符串数据使用s类型。
$mysqli = new mysqli("localhost", "username", "password", "test");
$stmt = $mysqli->prepare("UPDATE products SET price = ? WHERE product_id = ?");
$stmt->bind_param("di", $newPrice, $productId); // d表示double类型
$stmt->execute();
批量更新多条记录
结合事务处理确保批量操作的原子性,出错时回滚所有更改。
$pdo->beginTransaction();
try {
foreach ($updateData as $data) {
$stmt = $pdo->prepare("UPDATE orders SET status = ? WHERE order_id = ?");
$stmt->execute([$data['status'], $data['order_id']]);
}
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
}
使用ORM框架更新(如Laravel Eloquent)
通过模型实例修改属性后调用save()方法,或使用批量更新语法。
// 单条更新
$user = User::find(1);
$user->name = 'New Name';
$user->save();
// 批量更新
User::where('active', 1)->update(['role' => 'admin']);
条件更新与字段自增
在SQL中直接使用条件表达式和数学运算,减少数据库查询次数。
// 条件更新
$stmt = $pdo->prepare("UPDATE inventory SET stock = stock - ? WHERE item_id = ? AND stock >= ?");
$stmt->execute([$quantity, $itemId, $quantity]);
// 字段自增
$pdo->exec("UPDATE counters SET views = views + 1 WHERE page_id = 5");
更新后获取受影响行数
通过rowCount()或affected_rows验证更新是否生效,注意区分影响行数和匹配行数。
// PDO
$stmt = $pdo->prepare("UPDATE posts SET views = views + 1 WHERE post_id = ?");
$stmt->execute([$postId]);
$affectedRows = $stmt->rowCount();
// MySQLi
$stmt = $mysqli->prepare("UPDATE logs SET processed = 1 WHERE date < ?");
$stmt->bind_param("s", $date);
$stmt->execute();
$affectedRows = $stmt->affected_rows;
使用JOIN进行关联表更新
在多表关联场景中,通过JOIN语法一次性完成复杂更新逻辑。

$sql = "UPDATE orders o
JOIN shipments s ON o.order_id = s.order_id
SET o.status = 'shipped', s.ship_date = NOW()
WHERE o.payment_status = 'paid'";
$pdo->exec($sql);






