案例在PHP中的敏感查询

时间:2009-11-07 22:42:50

标签: php mysql

我尝试制作一份登记表。当用户发布字段时,我会检查USER_NAME。如果存在则不会将该行输入MYSQL。

发帖后:

$check = "SELECT name FROM test WHERE name='".$_POST['user_name']."';  
 $result = mysql_query($check) or die (mysql_error()); 
 $numrows = mysql_num_rows($resutl);
 if ($numrow != 0){ 
     echo "exist"; exit;           
 }else{ 
     insert.....
 }      

在数据库中,我有一行user_name = Test

如果发布的值是Test,那么确定,但是如果我发布“test”或“TeSt”或其他内容,那么该行将被识别。

如何使其不区分大小写?我想我应该使用str来小写到发布的值,但在查询中..我可以这样做吗?

谢谢

3 个答案:

答案 0 :(得分:2)

尝试SELECT name FROM test WHERE UPPER(name)='".strtoupper($_POST['user_name'])."'

请注意,您应该正确地转发已发布的用户名(请参阅php mysql_real_escape_string功能)

答案 1 :(得分:2)

如果字段的排序规则不区分大小写(例如utf8_general_cilatin1),则可以使用LIKE运算符执行不区分大小写的匹配。< / p>

"SELECT * FROM test WHERE name LIKE '$username';"

答案 2 :(得分:1)

区分大小写还取决于列的数据类型。您可以通过将列类型更改为VARCHAR来解决问题,而无需额外的字符串转换开销(即UPPER()strtoupper())。

From the MySQL Manual

  

对于非二进制字符串(CHAR,VARCHAR,TEXT),字符串搜索使用比较操作数的排序规则。对于二进制字符串(BINARY,VARBINARY,BLOB),比较使用操作数中字节的数值;这意味着对于字母字符,比较将区分大小写。

     

非二进制字符串和二进制字符串之间的比较被视为二进制字符串的比较。

     

简单比较操作(&gt; =,&gt;,=,&lt;,&lt; =,排序和分组)基于每个字符的“排序值”。具有相同排序值的字符被视为相同的字符。例如,如果“e”和“é”在给定的排序规则中具有相同的排序值,则它们会相等。