我有以下查询
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
答案 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);