PDO参数绑定报错SQLSTATE[HY093],请求排查代码问题
问题根源:参数名中的减号被PDO误解析
你遇到的SQLSTATE[HY093]错误,核心原因是SQL语句里的参数名包含了减号(-)。PDO会把:address-town里的-当成减法运算符,而不是参数名的一部分,所以它找不到你绑定的:address-town和:address-country这两个参数,自然就报错了。
修复步骤
- 修改SQL中的参数名:把带减号的参数改成下划线(或者其他合法字符,比如去掉减号),比如
:address_town和:address_country,和你的数据库字段名保持一致也更直观。 - 同步修改
bindValue的参数名:确保绑定的参数名和SQL里的完全匹配。 - 额外优化:把
$intId也改成参数绑定:你现在直接把$intId拼进SQL里,虽然做了intval转换,但最好还是用参数绑定,避免潜在的注入风险(养成好习惯)。
修改后的完整代码示例
<?php include('../../functions/database.php'); $conn = create_connection(); // 建议开启PDO错误模式,方便调试 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $id = $_POST['id']; $intId = intval($id); $name = $_POST['name']; $address1 = $_POST['address1']; $address2 = $_POST['address2']; $address3 = $_POST['address3']; $address_town = $_POST['address-town']; $address_country = $_POST['address-country']; // 修改参数名,把减号换成下划线,同时给company_id也用参数绑定 $stm = "INSERT INTO company_address (name, company_id, address_1, address_2, address_3, address_town, address_country) values(:name, :company_id, :address1, :address2, :address3, :address_town, :address_country)"; $query = $conn->prepare($stm); // 绑定所有参数,包括company_id $query->bindValue(':name', htmlspecialchars($name, ENT_QUOTES)); $query->bindValue(':company_id', $intId, PDO::PARAM_INT); // 指定参数类型为整数更严谨 $query->bindValue(':address1', htmlspecialchars($address1, ENT_QUOTES)); $query->bindValue(':address2', htmlspecialchars($address2, ENT_QUOTES)); $query->bindValue(':address3', htmlspecialchars($address3, ENT_QUOTES)); $query->bindValue(':address_town', htmlspecialchars($address_town, ENT_QUOTES)); $query->bindValue(':address_country', htmlspecialchars($address_country, ENT_QUOTES)); $query->execute(); header('Location: ' . $_SERVER['HTTP_REFERER']); ?>
额外说明
- PDO的参数名只能包含字母、数字和下划线,不能有减号、空格这类特殊字符,否则会被解析成SQL语法的一部分。
- 给
bindValue指定参数类型(比如PDO::PARAM_INT)可以让PDO更准确地处理数据,也能提升安全性。 - 开启
PDO::ERRMODE_EXCEPTION错误模式,能让你在调试时得到更详细的错误信息,方便排查问题。
内容的提问来源于stack exchange,提问作者pMru2020
相关产品推荐
相关产品推荐

