
php 中使用 pdo 执行 update 语句时,若在 set 子句最后一个字段赋值后误加逗号(如 listprice = :price,),将触发 sqlstate[42000] 错误(错误号 1064),提示语法错误。根本原因是 mysql 不允许 set 后跟冗余逗号。
该错误典型表现为:
Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; ... near 'WHERE productID = '1'' at line 6
定位关键线索:错误信息中 near 'WHERE productID = '1'' 表明 SQL 解析器在读到 WHERE 前已因语法异常中断——这通常意味着 SET 子句存在结构性问题,最常见即末尾多余的逗号。
在您提供的代码中,问题明确出现在 $query 字符串的 SET 部分:
$query = 'UPDATE products
SET categoryID = :category_id,
productCode = :code,
productName = :name,
listPrice = :price, ← ❌ 多余逗号!此处导致语法中断
WHERE productID = :product_id';✅ 正确写法(移除 listPrice = :price 后的逗号):
$query = 'UPDATE products
SET categoryID = :category_id,
productCode = :code,
productName = :name,
listPrice = :price ← ✅ 无逗号
WHERE productID = :product_id';⚠️ 注意事项:
- SQL 中 SET 后的字段赋值列表遵循「字段 = 值」的逗号分隔规则,最后一个赋值项后不可加逗号,否则 MySQL 解析器会将其视为语法错误;
- 此类错误不会在 PHP 层面报错,而是在执行 $statement->execute() 时由数据库引擎抛出,因此需结合 SQL 语句本身排查;
- 建议在开发中启用 PDO 错误模式以获取更清晰反馈:
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
- 进阶建议:使用 IDE 的 SQL 语法高亮或粘贴语句到 MySQL 客户端(如 phpMyAdmin 或 MariaDB CLI)中预校验,可快速暴露语法问题。
总结:该 1064 错误并非逻辑或权限问题,而是纯粹的 SQL 书写规范问题。养成编写 SQL 时「末项不加逗号」的习惯,并借助工具验证,可显著减少此类低级但致命的语法陷阱。










