我的应用程序中有一个按id或用户名从表中选择用户的查询:
SELECT * FROM users WHERE id = '$x' OR username = '$x'
当给定的用户名如
foo
,bar123
或id如1
,123
时,这是有效的。但是当我给一个类似
2foo
的用户名时,它同时选择user2foo
和user withid=2
。因此,它获取2
的2foo
并找到一个用户。此外,我还收到一条警告消息:1292:截断不正确的双精度值:2foo。有没有办法告诉mysql不要进行这种转换(对于这个查询而不是整个数据库)?还是需要在查询后进行筛选以丢弃错误结果?
最佳答案
查询是以某种方式形成的,在mysql中触发“this-is-a-feature-not-a-bug”行为:将同一字符串('$x')与数字字段(id)和varchar字段(username)进行比较。
虽然我确信,有很多方法可以在sql中实现这一点,但我怀疑唯一正确的方法是修复创建查询的php。有点像
if (is_numeric($x)) $sql="SELECT * FROM users WHERE id = '$x' OR username = '$x'";
else $sql="SELECT * FROM users WHERE username = '$x'";
应该会有帮助的。
为了完整起见,这里是sql版本:
SELECT * FROM users WHERE id = IF('$x' REGEXP '^[0-9]+$','$x',0) OR username = '$x'
注意:从oq中我假设$x已经被转义了。