无法搜索mysql数据库

时间:2011-10-07 05:58:58

标签: php mysql arrays search

关于我的脚本和搜索,我有两个问题。我有这个脚本:

$searchTerms = explode(' ', $varSearch);
$searchTermBits = array();
foreach($searchTerms as $term){
    $term = trim($term);
    if(!empty($term)){
        $searchTermBits[] = "column1 LIKE '%".$term."%'";
    }
}

$sql = mysql_query("SELECT * FROM table WHERE ".implode(' OR ', $searchTermBits)."");

我有一个数据名称为“rock cheer climbing here”的column1

如果我输入“攀岩”,此数据显示。这完美,但如果我只是键入“岩石”,它没有显示。那是为什么?

另外,如何为要搜索的关键字添加另一个“column2”?

谢谢!

3 个答案:

答案 0 :(得分:1)

搜索该字符串中的“rocks”不起作用,因为数据中不存在字符串“rocks”。看着它,对你来说很有意义,因为你知道“摇滚”的复数是“岩石”,但数据库并不知道。

您可以尝试的一个选项是从搜索字词中删除S,但是您遇到了其他问题 - 例如,“berry”的复数是“浆果”,如果删除S,您将成为寻找“berrie”,这对你没有任何帮助。

您可以添加更多行,例如

,以添加更多搜索字词
$searchTermBits[] = "column1 LIKE '%".$term."%'";

并将".$term."替换为您要搜索的内容。例如,

$searchTermBits[] = "column1 LIKE '%climb%'";

还有一点需要注意......编写后,您的代码很容易受到SQL注入的影响。以此为例...如果网站访问者在搜索字词'; DROP TABLE tablename;中输入内容,那么您的数据已被清除。

您应该做的是将searchTermBits[]行修改为:

$searchTermBits[] = "column1 LIKE '%" . mysql_real_escape_string($term) . "%'";

这可以防止任何恶意伤害您的数据。

答案 1 :(得分:0)

  1. 您的第1列数据rock cheer climbing here您的搜索条件%Rocks%完全不适合rocks不在您的column1数据中

  2. 您可以像对column1一样添加column2,然后使用AND运算符(column1 LIKE "%rock%" OR column1 LIKE "%climb%") AND (column2 LIKE "%rope%" OR column2 LIKE "%powder%")

  3. 将它们全部放在一起

    TIPS: 如果你的表/模式使用xx_xx_ci collat​​ion(那么这是不区分大小写的,mysql不关心区分大小写)但是如果是other,那么你需要确保搜索项必须区分大小写(mysql做区分大小写)。 / p>

答案 2 :(得分:0)

假设您提供的数据准确,则不应该匹配,因为您使用的是“Rocks”,字符串中的单词是“rock”。默认情况下,mysql不会进行区分大小写的匹配,因此情况可能并非如此。

另外,为避免sql注入,你绝对应该使用mysql_real_escape_string来逃避你的内容。

添加第二列也很容易。只需为每个搜索项为数组添加两个条目,一个用于column1,另一个用于column2。