PHP PDO操作MySQL时UPDATE语句同值更新不生效问题
问题原因
你当前的UPDATE语句中重复使用了同名PDO命名占位符:colour,PDO原生预处理模式默认不支持同一条语句内重复使用同名占位符:你传入的参数数组仅包含一个colour键,PDO只会将第一个占位符(SET子句后的:colour)绑定传入值,WHERE子句中的同名占位符不会被正确赋值,最终导致待更新值和匹配值相同时,匹配逻辑异常,更新0行。
你其余数据库查询能正常运行,是因为语句中没有出现重复使用同名占位符的场景。
修复方法
你可以任选以下一种方案修复:
- 方案一:使用不同名称区分两个位置的占位符,分别绑定对应的值
这是兼容性最好、最推荐的写法,示例代码如下:// 注意:你需要明确区分「要更新成的新颜色值」和「WHERE条件要匹配的原有颜色值」,不要复用同一个变量 $update = [ 'new_colour' => $newColour, 'old_colour' => $targetOldColour ]; $sql = "UPDATE colours SET colour=:new_colour WHERE colour=:old_colour"; $stmt = $db->prepare($sql); $stmt->execute($update); - 方案二:开启PDO模拟预处理支持重复占位符
如果你的业务场景确实需要用同一个值匹配两个占位符,可以在PDO初始化时开启模拟预处理,该模式支持同语句重复使用同名占位符:
注意:开启模拟预处理时,必须确保PDO连接时设置的字符集和数据库实际字符集完全一致,避免产生SQL注入风险。$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
内容的提问来源于stack exchange,提问作者gabrielkolbe
相关产品推荐
相关产品推荐

