
该错误源于 sql update 语句中 set 子句末尾误加了逗号,导致 mariadb 解析失败并抛出 sqlstate[42000] 语法错误;只需删除 `listprice = :price,` 后的冗余逗号即可修复。
在使用 PDO 执行 SQL 更新操作时,SQL 语句的语法必须严格符合 MySQL/MariaDB 规范。你遇到的致命错误:
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
其根本原因在于以下 SQL 片段中 listPrice = :price, 后多了一个逗号:
$query = 'UPDATE products
SET categoryID = :category_id,
productCode = :code,
productName = :name,
listPrice = :price, ← ❌ 错误:SET 子句末尾不允许逗号
WHERE productID = :product_id';根据 SQL 标准(及 MySQL 实际解析器要求),SET 后的字段赋值列表应为 用逗号分隔、但末尾不可有逗号 的形式。该多余逗号使解析器误认为还有下一个字段,却紧接着遇到了 WHERE 关键字,从而触发语法错误(错误码 1064)。
✅ 正确写法如下(已移除冗余逗号):
$query = 'UPDATE products
SET categoryID = :category_id,
productCode = :code,
productName = :name,
listPrice = :price ← ✅ 正确:无尾随逗号
WHERE productID = :product_id';? 额外建议与最佳实践:
启用 PDO 错误模式:在 database.php 中设置 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,可让错误更早暴露、定位更精准;
使用 bindValue() 顺序无关,但推荐按占位符出现顺序绑定,提升可维护性;
执行前可打印/日志化 $query(注意:勿在生产环境直接 echo 敏感 SQL),辅助调试;
-
若涉及更多字段,建议采用垂直对齐格式,便于肉眼校验逗号:
$query = 'UPDATE products SET categoryID = :category_id, productCode = :code, productName = :name, listPrice = :price, description = :description ← 最后一项也不加逗号 WHERE productID = :product_id';
⚠️ 注意:此错误与数据内容、参数绑定、数据库连接等无关,纯属 SQL 语法书写疏忽——这也是为什么问题被标记为“typo”。养成编写 SQL 后快速扫视标点(尤其是逗号、括号、引号)的习惯,能显著减少此类低级但致命的问题。
修复后,脚本将正常执行更新,并安全跳转至 index.php。









