无效的参数编号:绑定变量的数量不匹配令牌的数量
问题描述:
我有一个表格: '对象'有几列: object_id:int,object_type:int,object_status:int,object_lati:float,object_long:float 我的查询是:无效的参数编号:绑定变量的数量不匹配令牌的数量
$stmt = $db->query('SELECT o.object_id, o.object_type, o.object_status, o.object_lati, o.object_long FROM objects o WHERE o.object_id = 1');
$res = $stmt->fetch();
PDO抛出一个错误:
SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
当我删除列object_lati
或object_long
查询做工精细。
答
尝试像声明:
$stmt = $db->query('SELECT object_id, object_type, object_status, object_lati, object_long FROM objects o WHERE object_id = ? ', 1);
答
试试这个,而不是
$row = $db->fetchRow('SELECT o.object_id, o.object_type, o.object_status, o.object_lati, o.object_long FROM objects o WHERE o.object_id = 1');
// return false if no result found
或获取记录设置
$rs = $db->fetchAll('SELECT o.object_id, o.object_type, o.object_status, o.object_lati, o.object_long FROM objects o WHERE o.object_id = 1');
// returns array with results
答
虽然这个特定的问题不是一个真实的,因为所提供的代码将永远不会产生这样的错误,看起来Google很乐意将访问者发送给这个p年龄。对他们来说,是遵循了答案:
这个问题永远不能凭借它query()
方法调用引起的,因为它本质上属于准备好的声明。
错误本身非常明显:“令牌数量”代表查询中的?
或:name
令牌的数量(也称为“占位符”),而“绑定的变量数量”表示变量ether通过bindValue
或`bindParam绑定,或通过执行发送(技术上相同)。所以,当一个人试图绑定更多的变量而不是查询中定义的令牌时,PDO会引发这个错误。
例如,如果存在与没有定义令牌准备的查询,但我们试图给一个变量将其绑定:
$stmt = $db->prepare('SELECT * FROM objects o WHERE o.object_id = 1');
$stmt->execute(array($id));
那么它会导致在所讨论的非常错误消息,作为数绑定变量(1)的数量与令牌(0)的数量不匹配。
为了解决这个问题,一个只需要仔细比较与被绑定到声明变量的数量准备好的查询令牌的数量。
是不是有没有使用ORM的原因?现在 – 2011-08-18 20:09:16
@YourCommonSense,这个问题是(间接)[元交]的主题(http://meta.*.com/q/253911/176646),可能发生的越快。 – ThisSuitIsBlackNot 2014-05-07 18:22:50