[英]Search w/ MySQL/PHP but not Case-Sensitive
我在学校里学会了用MySQL和PHP编写搜索程序。
我的search.php有以下代码:
<?php
mysql_connect("localhost", "root", "");
mysql_select_db("db1");
$sql = "SELECT * from tuser";
$Namen = mysql_query ($sql);
$user_id = $_GET['user_id'];
$search = $_GET['search'];
while ($ergebnis_datensatz = mysql_fetch_array($Names)){
$user_id = $ergebnis_datensatz['user_id'];
$name = $ergebnis_datensatz['name'];
$surname = $ergebnis_datensatz['surname'];
if ($name == "$search") {
echo "$name $surname";
}
else {
echo "";
}
if ($surname == "$search") {
echo "$name $surname";
}
else {
echo "";
}
}
?>
在我的搜索输入站点上,我有一个简单的输入,其中“ name = search”
如果我现在使用此搜索,则区分大小写。 示例:我搜索“ * k * elvin”,但未显示任何内容。 但是,如果搜索“ * K * elvin”,我会得到结果。
如何使它不区分大小写?
检查表的排序规则。 默认情况下(取决于您的配置),MySQL将使用utf8_general_ci
,其中ci
不区分大小写。 另一方面,如果您使用utf8_bin
,则将获得区分大小写的排序规则,并且所有搜索都将区分大小写。
其他常见的排序规则latin1_general_ci
(和*_cs
和latin1_bin
)。
您确实应该优化查询并仅搜索相关选项。
虽然可以通过将两个参数都转换为小写来搜索不区分大小写的字符(例如)。 这样,您的代码将变为: if (strtolower($name) == strtolower($search)) {
和if (strtolower($surname) == strtolower($search)) {
但是,我将您的查询限制为: SELECT * from tuser WHERE name LIKE $search OR surname LIKE $search
,这将产生与您的搜索参数匹配的所有结果。
别忘了逃脱$ search
如前所述,大多数常见的MySQL排序规则都不区分大小写。 但是,如果您不想修改排序规则,则可以使用BINARY运算符解决此问题。
http://dev.mysql.com/doc/refman/5.0/en/charset-binary-op.html
即
SELECT *
FROM tuser
WHERE BINARY $search IN (name,surname)
所以给
$sql = 'SELECT * FROM tuser WHERE BINARY "'.$search.'" IN (name,surname)';
重要事项请注意这一点。 目前,这可能会使您的SQL处于开放状态。 这将比选择“全部”然后在PHP中对其进行循环更为有效,但首先需要对代码进行一些改进。
这是有关SQL注入的答案, 如何防止PHP中的SQL注入?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.