0

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

我怎样才能使它不区分大小写?

4

4 回答 4

4

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

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

于 2013-03-27T16:47:27.610 回答
1

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

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

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

不要忘记转义 $search

于 2013-03-27T16:48:45.240 回答
1

如前所述,大多数常见的 MySQL 排序规则不区分大小写。但是,如果您不想修改排序规则,则可以使用 BINARY 运算符解决此问题。

http://dev.mysql.com/doc/refman/5.0/en/charset-binary-op.html

IE

SELECT * 
FROM tuser 
WHERE BINARY $search IN (name,surname)

所以给予

$sql = 'SELECT * FROM tuser WHERE BINARY "'.$search.'" IN (name,surname)';

重要事项请注意这一点。目前,这可能会使您的 SQL 易于注入。这将比选择所有内容然后在 PHP 中循环它更有效,但您首先需要对代码进行一些改进。

Here's an answer on here about SQL injection How can I prevent SQL injection in PHP?

于 2013-03-27T16:51:28.530 回答
0

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

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

至:

if (strcasecmp($name, $search)) {
于 2013-03-27T16:50:48.283 回答