【发布时间】:2012-02-06 03:06:35
【问题描述】:
我的应用程序中有一个查询,它按 ID 或用户名从表中选择用户:
SELECT * FROM users WHERE id = '$x' OR username = '$x'
当给定用户名foo、bar123 或1、123 等ID 时,此功能有效。
但是,当我提供像2foo 这样的用户名时,它会同时选择用户2foo 和id=2 的用户。所以它需要2foo 的2 并找到一个用户。此外,我收到一条警告消息:1292:截断不正确的 DOUBLE 值:2foo。
有没有办法告诉 MySQL 不要进行这种转换(对于这个查询而不是整个 db)?还是我需要在查询后进行过滤以丢弃错误结果?
【问题讨论】:
-
您能分享构建实际查询的相关代码吗?这很可能不是mysql的问题,而是生成的问题。
-
我在 MySQL 查询浏览器中输入了这个查询:
SELECT * FROM users WHERE id = '2foo' OR username = '2foo'。没有周围的代码,因为我将此查询标识为我的应用程序中有问题的查询。 MySQL版本:5.1.41-3ubuntu12.10 -
正确的做法是检查 $x 是否是一个数字并相应地构建您的查询:
if(is_numeric($x)){ $sql = "SELECT * FROM users WHERE id = $x OR username = '$x'" } else { $safeX = mysql_real_escape_string($x); // Or prepared statements, or whatever else you prefer. $sql = "SELECT * FROM users WHERE username = '$x'" } -
出于好奇,如果用户使用用户名 '123' 注册,你会怎么做?
-
@JoryGeerts 这是我现在的解决方案,非常感谢您的想法(将其发布为获得投票的答案)
标签: mysql sqldatatypes type-conversion