MySQL脚本执行报错:两条SET语句为何触发语法错误?
问题原因及解决建议
核心原因
你的问题大概率是PHP数据库扩展默认禁用了多语句查询功能。当你把两条SET语句用分号拼接成一个字符串执行时,扩展会将整个内容当作单条SQL语句解析,到第二条SET @natureTime:=1时就会判定为语法错误。而MySQL客户端本身支持多语句执行,所以直接在客户端跑没问题。
解决建议
- 拆分语句执行:把两条
SET命令分开,分两次调用PHP的数据库执行方法,每次执行一条语句:// PDO示例 $pdo->exec("SET @natureRegTime:=7200;"); $pdo->exec("SET @natureTime:=1;"); - 开启多语句支持(谨慎使用):如果必须合并执行,可在初始化数据库连接时开启多语句支持,但要注意这会增加SQL注入风险,务必确保所有输入都经过严格过滤:
- PDO示例:
$options = [ PDO::MYSQL_ATTR_MULTI_STATEMENTS => true, // 其他连接选项 ]; $pdo = new PDO($dsn, $username, $password, $options); - mysqli示例:使用
mysqli_multi_query()替代普通query(),但同样要注意注入风险。
- PDO示例:
- 检查扩展配置:确认PHP的数据库扩展(如pdo_mysql、mysqli)是否有相关配置限制,比如是否强制禁用了多语句执行。
内容的提问来源于stack exchange,提问作者John Perczyk
相关产品推荐
相关产品推荐

