【问题标题】:Search w/ MySQL/PHP but not Case-Sensitive使用 MySQL/PHP 搜索但不区分大小写
【发布时间】:2013-03-27 16:44:32
【问题描述】:

我在学校学习使用 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”,我会得到我的结果。

如何让它不区分大小写?

【问题讨论】:

    标签: php mysql search search-engine


    【解决方案1】:

    检查您的表格的排序规则。默认情况下(取决于您的配置)MySQL 将使用utf8_general_ci,其中ci 不区分大小写。另一方面,如果您使用utf8_bin,您将获得区分大小写的排序规则,并且您的所有搜索都将区分大小写。

    其他常见的排序规则是latin1_general_ci(和*_cs,和latin1_bin)。

    【讨论】:

      【解决方案2】:

      您确实应该优化您的查询并仅搜索相关选项。

      虽然您可以通过将两个参数都转换为小写来搜索不区分大小写(例如)。这样,您的代码将变为:if (strtolower($name) == strtolower($search)) {if (strtolower($surname) == strtolower($search)) {

      但是,我会将您的查询限制为: SELECT * from tuser WHERE name LIKE $search OR surname LIKE $search,它将产生与您的搜索参数匹配的所有结果。

      别忘了转义 $search

      【讨论】:

        【解决方案3】:

        如前所述,大多数常见的 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 注入的答案How can I prevent SQL injection in PHP?

        【讨论】:

          【解决方案4】:

          您可以使用strcasecmp() 函数来比较两个字符串并忽略区分大小写。

          if ($name == "$search") {
          

          到:

          if (strcasecmp($name, $search)) {
          

          【讨论】:

          • 如果你想看看 "$name == $search" 和 "strcasecmp",代码看起来更像是 "if (strcasecmp($name, $search) == 0)",这个如果二进制字符串等于则返回 0,否则返回 >0 或
          猜你喜欢
          • 2011-04-13
          • 1970-01-01
          • 2013-09-26
          • 2017-06-30
          • 2013-02-17
          • 1970-01-01
          • 2011-03-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多