8

我有一个使用 ajax 动态搜索数据库中数据的代码,但我一次只能搜索 1 个关键字。我想对其进行修改,以便可以搜索多个关键字。现在,如果我键入2个以空格分隔的关键字,并且在数据库中,数据不以空格分隔,则不会有结果。如果在数据库中的数据是:

“playstation3”或“玩酷 station3”

我搜索:

播放站

不会有任何结果。我想知道是否可以修改我的代码,以便我可以搜索 2 个或多个关键字或由空格或另一个单词或点或下划线或 (-) 或 (+) 或 (%) 分隔的单词或(任何其他哈哈)。

我知道我应该使用 pdo 或 mysqli,但我仅将其用于测试!

$queried = $_POST['query'];



$search = mysql_query("SELECT * FROM links WHERE name LIKE '%$queried%'");
while($searche = mysql_fetch_array($search)){
    echo "".$searche['link']."</br>".$searche['name']."</br>".$searche['size']."</br>".$searche['category']."<hr></br></br>";

    }
4

4 回答 4

24

动态搜索所有关键词,可以使用explode功能将所有关键词分开;

$queried = mysql_real_escape_string($_POST['query']); // always escape

$keys = explode(" ",$queried);

$sql = "SELECT * FROM links WHERE name LIKE '%$queried%' ";

foreach($keys as $k){
    $sql .= " OR name LIKE '%$k%' ";
}

$result = mysql_query($sql);

注意 1:在查询中使用用户输入之前,请始终转义它。

注 2: mysql_* 函数已弃用,请使用 Mysqli 或 PDO 作为替代

2018 年更新 - 注意 3:不要忘记检查$queried变量的长度并设置限制。否则,用户可以输入一个不同的大字符串并使您的数据库崩溃。

于 2013-03-21T02:55:05.363 回答
2

甚至不再使用mysql_*函数进行测试。它们并不容易mysqli,以防万一您认为在这里测试容易然后移动。

但是,您可以将输入拆分为 a,并尝试此操作

<?php

$queried="abc,test, testing";
$values=explode(',',$queried);


$sql="SELECT * FROM links WHERE";
$i=0;

foreach($values as $v)
{
    $v=trim($v);
    if($i==0)
    {
        $sql.=" name LIKE '%$v%'";
    }
    else
    {
        $sql.=" OR name LIKE '%$v%'";
    }

    $i++;
}

$search = mysql_query($sql);
while($searche = mysql_fetch_array($search))
{
    echo "".$searche['link']."</br>".$searche['name']."</br>".$searche['size']."</br>".$searche['category']."<hr></br></br>";

}    
?>
于 2013-03-21T02:53:53.663 回答
2

这是@Hanky Panky 答案的MySQL PDO版本

 $queried="abc,test, testing";
 $values=explode(',',$queried);
 $sql="SELECT * FROM citations_new WHERE";
 $i=0;
        foreach($values as $v){
            $v=trim($v);
            if($i==0) {
                $sql.=" name LIKE '%$v%'";
            }
           else {
               $sql.=" OR name LIKE '%$v%'";
           }
           $i++;
         }

$sth = $this->db->prepare($sql);
$sth->execute();
$rows = $sth->setFetchMode(PDO::FETCH_ASSOC);

while($row = $sth->fetch()){
    //enter code here   
}
于 2018-10-30T19:16:11.943 回答
0

只需添加一个 OR 子句。

例如

SELECT * FROM links WHERE name LIKE '%$keyword1%' OR name LIKE '%$keyword2%'

但我强烈建议您使用参数化查询或其他安全库来避免Sql 注入攻击

于 2013-03-21T02:49:31.873 回答