MySQL中正常执行的UPDATE语句在PHP中报错的问题排查
问题:PHP执行多语句SQL报错,直接在MySQL执行正常
问题场景
直接在MySQL中执行多语句SQL可正常生效,但通过PHP执行时触发语法错误。
执行的SQL语句
UPDATE names SET rsvp_status = '1' WHERE name_id = '13'; UPDATE names SET rsvp_status = '1' WHERE name_id = '15';
PHP执行时的错误信息
Error: UPDATE names SET rsvp_status = '1' WHERE name_id = '13'; UPDATE names SET rsvp_status = '1' WHERE name_id = '15'; You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UPDATE names SET rsvp_status = '1' WHERE name_id = '15'' at line 1
用到的PHP代码
$query = "UPDATE names SET rsvp_status = '1' WHERE name_id = '13'; UPDATE names SET rsvp_status = '1' WHERE name_id = '15';"; $db = $conn; $execute = mysqli_query($db, $query); if ($execute==true) { $success = 1; } else { echo "Error: " . $query . "<br>" . mysqli_error($db); }
names表结构
| name_id | name | rsvp_status |
|---|---|---|
| 13 | John | 0 |
| 15 | David | 0 |
| 17 | Bill | 1 |
原因及解决方案
报错核心原因是:mysqli_query默认仅支持单条SQL语句执行,它会把第二个UPDATE判定为语法错误。
方案1:拆分SQL为两条单独执行(推荐)
将原语句拆分为独立的UPDATE,分别调用mysqli_query执行,这种方式更安全,也符合mysqli常规用法:
// 执行第一条更新 $query1 = "UPDATE names SET rsvp_status = '1' WHERE name_id = '13';"; mysqli_query($db, $query1); // 执行第二条更新 $query2 = "UPDATE names SET rsvp_status = '1' WHERE name_id = '15';"; mysqli_query($db, $query2);
方案2:使用mysqli_multi_query执行多语句
如果必须执行多语句,可使用mysqli_multi_query,但需注意该方式存在SQL注入风险,必须确保语句完全可信:
$query = "UPDATE names SET rsvp_status = '1' WHERE name_id = '13'; UPDATE names SET rsvp_status = '1' WHERE name_id = '15';"; $execute = mysqli_multi_query($db, $query); // 循环获取所有语句的执行结果,避免后续数据库操作异常 do { if ($result = mysqli_store_result($db)) { mysqli_free_result($result); } } while (mysqli_next_result($db)); if ($execute) { $success = 1; } else { echo "Error: " . $query . "<br>" . mysqli_error($db); }
额外说明:name_id为整数类型,SQL中可去掉单引号,写成WHERE name_id = 13更规范,不过这并非本次报错的原因。
内容的提问来源于stack exchange,提问作者RobertN
相关产品推荐
相关产品推荐

