PDO执行URL传入SQL语句时出现MySQL 1064语法错误求助
问题根源与解决方案
你的问题出在这一行多余的代码:
$id = '"'.$_GET['query'].'"';
你给完整的SQL语句套了一层双引号,导致PDO最终执行的SQL变成了这个样子:
"INSERT INTO orders (IDCliente, IDOrdine, DTOrdine) VALUES ('0569', 2593, '19-09-2018')"
而SQL语法里,整段查询语句根本不需要被引号包裹——这对双引号会被数据库识别成无效的语法符号,直接触发1064语法错误。
修复步骤
直接删除那行添加双引号的代码,把获取参数的逻辑改成:
$id = isset($_GET['query']) ? $_GET['query'] : die('ERROR: Empty string');
这样$id就直接是原始的合法SQL语句,传给prepare()后就能正常执行了。
额外提醒(针对你的场景补充)
虽然你提到这个功能仅内部业务软件使用,但这种直接接收并执行外部传入完整SQL的方式,存在极高的SQL注入风险——哪怕是内部系统,一旦请求被劫持、参数被篡改,数据库的安全会直接受到威胁。如果后续有优化空间,建议改用PDO的参数化查询模式,把SQL结构和数据分离,比如:
// 示例:拆分SQL结构与参数 $stmt = $con->prepare("INSERT INTO orders (IDCliente, IDOrdine, DTOrdine) VALUES (:clientId, :orderId, :orderDate)"); $stmt->bindParam(':clientId', $clientId); $stmt->bindParam(':orderId', $orderId); $stmt->bindParam(':orderDate', $orderDate); $stmt->execute();
当然,如果当前场景确实只能通过传入完整SQL来对接,修复后的代码可以满足你的需求。
内容的提问来源于stack exchange,提问作者Ogum
相关产品推荐
相关产品推荐

