我的应用程序中有一个按id或用户名从表中选择用户的查询:

SELECT * FROM users WHERE id = '$x' OR username = '$x'

当给定的用户名如foobar123或id如1123时,这是有效的。
但是当我给一个类似2foo的用户名时,它同时选择user2foo和user withid=2。因此,它获取22foo并找到一个用户。此外,我还收到一条警告消息: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已经被转义了。

09-04 08:06
查看更多