我的应用程序中有一个查询,它通过ID或用户名从表中选择用户:
SELECT * FROM users WHERE id = '$x' OR username = '$x'
当给定foo
,bar123
等用户名或1
,123
等ID时,此功能正常工作。
但是当我提供2foo
这样的用户名时,它会同时选择用户2foo
和用户id=2
。因此它需要2
2foo
并找到一个用户。另外,我收到一条警告消息: 1292:截断错误的DOUBLE值:2foo 。
有没有办法告诉MySQL不要进行此转换(对于此查询而不是整个数据库)?或者我是否需要在查询后进行过滤以丢弃错误结果?
答案 0 :(得分:5)
您的查询是以某种方式形成的,它会在MySQL中触发“这是一个特征而不是错误”的行为:您将相同的字符串('$ x')与数字字段(id)进行比较)和varchar字段(用户名)。
虽然我确信,有一些方法可以在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已经被转义。