MYSQL查询神奇地抓取数值

时间:2011-07-17 19:25:20

标签: php mysql database

我有以下查询

SELECT * FROM (`user_profiles`) WHERE `user_id` = $user_id LIMIT 1

$user_id是一个URI细分。例如$user_id = 64会生成

SELECT * FROM (`user_profiles`) WHERE `user_id` = '64' LIMIT 1

如果我在用户ID中添加字母字符,例如http://www.mysite.com/profile/64kjdsg

我明白了:

SELECT * FROM (`user_profiles`) WHERE `user_id` = '64kjdsg' LIMIT 1

仍会返回正确的数据,尽管没有用户ID等于64kjdsg。我表中的用户标识列是int(11)。查询似乎自动从64kjdsg中获取数值并与db表中的数值匹配。这是一个我不知道的MYSQL函数吗?

这是怎么回事?我正在查询使用Codeigniter框架,如果这会产生差异。

更新:发现了类似的问题MySQL integer comparison ignores trailing alpha characters

4 个答案:

答案 0 :(得分:2)

当您与数字列进行比较时,MySQL会将您的字符串转换为数字(因此它会从第一个非数字字符的出现中删除所有内容)。它是default behavior

mysql> select '23andthensome' + 4;
+---------------------+
| '23andthensome' + 4 |
+---------------------+
|                  27 |
+---------------------+
1 row in set, 1 warning (0.02 sec)

mysql> show warnings;
+---------+------+---------------------------------------------------+
| Level   | Code | Message                                           |
+---------+------+---------------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: '23andthensome' |
+---------+------+---------------------------------------------------+
1 row in set (0.02 sec

所以,做出更多正确的查询,事先检查一下是某个数字(filter_var(FILTER_VALIDATE_INT,$id);),只在它出现时使用它,然后:不要将它作为字符串发送到MySQL:如果你想要比较数字,发送不应引用的数字。

或者,您可以让MySQL完成工作,但这似乎是浪费:

mysql> select 23 = '23andthensome';
+----------------------+
| 23 = '23andthensome' |
+----------------------+
|                    1 |
+----------------------+
1 row in set, 1 warning (0.00 sec)
mysql> select cast(23  as CHAR) = '23andthensome';
+-------------------------------------+
| cast(23  as CHAR) = '23andthensome' |
+-------------------------------------+
|                                   0 |
+-------------------------------------+
1 row in set (0.02 sec)

答案 1 :(得分:1)

签入您的脚本是urlsegment整数。您可以使用ctype_digit来执行此操作。如果不是,请不要触摸您的数据库。说“没有这样的用户”

答案 2 :(得分:1)

检查出来:http://ideone.com/khpEv,它被称为类型杂耍。如果'64kjdsg'字符串将转换为整数(64),因为user_id为INT,否则会产生语法错误。

PHP示例:

<?php
echo (int) '64kjdsg'; // 64
?>

答案 3 :(得分:0)

这是安全漏洞 但是,如果

$user_id = 5;

结果是

SELECT * FROM (`user_profiles`) WHERE `user_id` = 5 LIMIT 1

SELECT * FROM (`user_profiles`) WHERE `user_id` = `5` LIMIT 1

尝试使用intval()

$user_id = intval($user_id);