2014-09-26 64 views
1

我在使用PHP和SQL显示数据库中的文本时遇到了一些麻烦。下面是一个类似于我的脚本。如何消除MySQL中的重复搜索结果?

$search_split = explode(" ", $search); //$search is what user entered 
foreach ($search_split as $searcharray) { 
    $searched = mysqli_query($connect, "SELECT * FROM people WHERE `description` LIKE '%$searcharray%'"); 
    while($info = mysqli_fetch_array($searched)) { 
    echo $info['description']; 
    } 
} 

因此,例如,用户输入'他是男性'。我使用'爆炸'功能将这个词分为'他','是'和'男'三部分。之后,我在数据库中搜索与这三个词类似的词。但是,如果一行有全部三个字,它将显示该行三次。我怎样才能让它只显示一次?

+0

啊,你需要运行一个查询,作为评论者贝尔ow说。尝试以“WHERE x LIKE'%word1%或WHERE x LIKE'%word2%'...'的形式构建查询。 – halfer 2014-09-26 07:38:45

+0

问题出在你的代码中,而不是SQL语句。将单个结果放在由“description”键入的字典中。重复的结果行将只覆盖先前的条目。最后字典将只包含唯一条目 – 2014-09-26 07:43:07

回答

1

首先将结果存储到一个数组中,然后显示它。请参阅以下代码。

$search_split = explode(" ", $search); //$search is what user entered 
foreach ($search_split as $searcharray) { 
    $searched = mysqli_query($connect, "SELECT * FROM people WHERE `description` LIKE '%$searcharray%'"); 
    while($info = mysqli_fetch_array($searched)) { 
    $results[$info['YOUR_PRIMARY_KEY']] = $info['description']; // this will over write your previous record 
    } 
} 
foreach($results as $result){ 
    echo $result; 
} 

现在每条记录只显示一次。

+0

您仍然会得到重复,因为来自不同查询的重复结果将出现在'results'中的不同条目中。 – 2014-09-26 07:41:20

+0

@PanagiotisKanavos不,每次重复的行都会被覆盖。它非常简单的解决方案 – Manibharathi 2014-09-26 07:45:26

+2

糟糕,没有注意到你正在使用数组作为字典。尽管全文搜索会更有效 – 2014-09-26 07:48:52

0

你已经把你的db查询放在一个foreach循环中,循环3次(用当前数据:he,is和male)。你想要做的就是把所有的搜索变量在一个查询,像什么:

$search_split = explode(" ", $search); //$search is what user entered 
$querypart = "'%" . implode("%' AND '%", $search_split) . "%'"; // use OR or AND, to your liking 

$searched = mysqli_query($connect, "SELECT * FROM people WHERE `description` LIKE " . $querypart); 
while($info = mysqli_fetch_array($searched)) { 
    echo $info['description']; 
} 

这还不查询输入的任何转义/消毒,做到心中有数......

2

你可以这样做像这样:

$search = 'test search me'; 
$search_split = array_map(function($piece) use ($mysqli_connection){ 
    return "'%" . $mysqli_connection->real_escape_string($piece) . "%'"; 
}, explode(' ', $search)); //$search is what user entered 
$search_split = implode(' OR `description` LIKE ', $search_split); 
$sql = "SELECT * FROM people WHERE `description` LIKE $search_split"; 
echo $sql; // SELECT * FROM people WHERE `description` LIKE '%test%' OR `description` LIKE '%search%' OR `description` LIKE '%me%' 
$searched = mysqli_query($connect, $sql); 
+2

解决了问题,但允许SQL注入 – 2014-09-26 07:42:14

+0

@PanagiotisKanavos是的,我在发布良好洞察之前了解了repurcusions – Ghost 2014-09-26 07:42:56

+0

谢谢!这是工作! – jacktheking 2014-10-02 05:41:01

2

你能用full text search

添加全文索引表

ALTER TABLE people ADD FULLTEXT(description); 

然后你可以使用一个这样的查询

SELECT * 
FROM people 
WHERE 
MATCH (description) 
AGAINST ('+He +is +male' IN BOOLEAN MODE) 
0
$result = array();  

$search_split = explode(" ", $search); //$search is what user entered 
    foreach ($search_split as $searcharray) { 
     $searched = mysqli_query($connect, "SELECT * FROM people WHERE `description` LIKE '%$searcharray%'"); 
     while($info = mysqli_fetch_array($searched)) { 
      $result[] = $info['description']; 
     } 
    } 

$finalres = array_unique($result); 

所以,finalres包含唯一结果

for($i = 0; $i < count($finalres); $i++) 
    echo $finalres[$i];