Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何消除MySQL中重复的搜索结果?_Php_Mysql_Sql - Fatal编程技术网

Php 如何消除MySQL中重复的搜索结果?

Php 如何消除MySQL中重复的搜索结果?,php,mysql,sql,Php,Mysql,Sql,我在使用PHP和SQL显示数据库中的文本时遇到一些问题。下面是一个类似于我的脚本 $search_split = explode(" ", $search); //$search is what user entered foreach ($search_split as $searcharray) { $searched = mysqli_query($connect, "SELECT * FROM people WHERE `description` LIKE '%$searchar

我在使用PHP和SQL显示数据库中的文本时遇到一些问题。下面是一个类似于我的脚本

$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'];
    }
}

例如,用户输入“他是男性”。我使用“explode”函数将这个词分为“He”、“is”和“male”三个部分。之后,我在数据库中搜索与这三个词相似的词。但是,如果一行包含所有这三个单词,它将显示该行三次。如何使其仅显示一次?

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

$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;
}

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

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

$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;
}

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

您已将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'];
}

这不会对查询输入进行任何转义/清理,请注意……

您已将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'];
}

这不会对查询输入进行任何转义/清理,请注意……

您可以执行以下操作:

$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);

你可以这样做:

$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);
你能用吗

向表中添加全文索引

ALTER TABLE people ADD FULLTEXT(description);
然后您可以使用这样的查询

SELECT * 
FROM people 
WHERE 
MATCH ( description ) 
AGAINST ('+He +is +male' IN BOOLEAN MODE)
你能用吗

向表中添加全文索引

ALTER TABLE people ADD FULLTEXT(description);
然后您可以使用这样的查询

SELECT * 
FROM people 
WHERE 
MATCH ( description ) 
AGAINST ('+He +is +male' IN BOOLEAN MODE)
因此,最终结果包含独特的结果

for($i = 0; $i < count($finalres); $i++)
    echo $finalres[$i];
for($i=0;$i
因此,最终结果包含独特的结果

for($i = 0; $i < count($finalres); $i++)
    echo $finalres[$i];
for($i=0;$i
Ah,正如下面的评论员所说,您只需要运行一个查询。请尝试以
的形式生成查询,其中x类似于“%word1%”或x类似于“%word2%”……
。问题出在代码中,而不是SQL语句中。将单个结果放入由
说明
键入的字典中。重复的结果行只会覆盖以前的条目。最后,字典将只包含唯一的entriesAh,您只需要运行一个查询,正如下面的评论员所说。请尝试以
的形式生成查询,其中x类似于“%word1%”或x类似于“%word2%”……
。问题出在代码中,而不是SQL语句中。将单个结果放入由
说明
键入的字典中。重复的结果行只会覆盖以前的条目。最后,字典将只包含唯一的条目您仍然会得到重复的条目,因为来自不同查询的重复结果将出现在
results
@PanagiotisKanavos No的不同条目中,每次重复的行都将被覆盖。这是一个非常简单的解决方案。哎呀,我没注意到你把数组用作字典。虽然全文搜索会更有效,但仍然会得到重复的结果,因为不同查询的重复结果将出现在
results
@PanagiotisKanavos No的不同条目中,每次重复的行都会被覆盖。这是一个非常简单的解决方案。哎呀,我没注意到你把数组用作字典。这应该是可行的,,虽然全文搜索将更有效地解决问题,但允许SQLinjection@PanagiotisKanavos是的,我在发布好消息之前理解了重新循环insight@jacktheking我很高兴这对解决问题没有任何帮助,但允许使用SQLinjection@PanagiotisKanavos是的,我在发布好消息之前理解了重新循环insight@jacktheking 我很高兴这没问题