MySQL JOIN语句在PHPMyAdmin正常,PDO中却报id列歧义
问题
在MySQL/PHPMyAdmin中执行以下SQL语句可正常运行:
SELECT longitude,latitude FROM event JOIN location ON event.locationId=location.id WHERE event.id=1234
但在PHP 8.1的PDO中使用带命名参数的语句执行时,却出现歧义报错:
SELECT longitude,latitude FROM event JOIN location ON event.locationId=location.id WHERE event.id=:event-id
$stmt->execute([':event-id' => 1234]);
报错信息:
Select failed: SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous
明明已经给id指定了表前缀event.,为什么还会报列歧义的错误?
原因及解决办法
问题根源是PDO命名参数不支持连字符。当你写:event-id时,MySQL会错误地将其解析为event - id(即event表的列减去id列),原本的WHERE event.id=:event-id就被曲解成了WHERE event.id = event - id,这里的id没有指定表名,自然触发了歧义报错。
解决方式很直接,修改命名参数的格式,把连字符换成下划线或者去掉:
- 方案一:用下划线替代连字符
SELECT longitude,latitude FROM event JOIN location ON event.locationId=location.id WHERE event.id=:event_id
$stmt->execute([':event_id' => 1234]);
- 方案二:使用驼峰式参数名
SELECT longitude,latitude FROM event JOIN location ON event.locationId=location.id WHERE event.id=:eventId
$stmt->execute([':eventId' => 1234]);
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

