PHP多标签搜索

时间:2012-12-18 19:53:17

标签: php search tags

此脚本部分正常工作,但如果1个视频上有3个标签,并且我输入所有3个标签,则视频会返回3次,不知道如何纠正此问题。

$search = sanitize($_GET['search']);
$array = explode(" ", $search);
foreach($array as $mySearch)
{
  $query = mysql_query("SELECT * FROM `videos`");
  while($mad = mysql_fetch_array($query))
  {
    if(strpos($mad['tags'], $mySearch))
    {
      // show results
      echo "<div class='comment_1'>$mad[title]</div>";
    }
  }
}

我们非常感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

您可以稍微更改一下并执行:

$search = mysqli_real_escape_string($_GET['search']);
$search = preg_replace('/\s+/m', '|', $search);
$query = mysqli_query("SELECT * FROM `videos` where tags regexp '{$search}'");
while($mad = mysqli_fetch_array($query))
{
   // show results
   echo "<div class='comment_1'>{$mad['title']}</div>";
   break;
}

请注意,我将mysql_*函数更改为mysqli_*等效函数,因为它们已被弃用。我还将您的代码缩减为一个循环,并将搜索字词添加到您的查询

答案 1 :(得分:1)

这应该有效

$search = sanitize($_GET['search']);
$array = explode(" ", $search);

$query = mysql_query("SELECT * FROM `videos`");
while($mad = mysql_fetch_array($query)) {
    foreach($array as $mySearch) {
        if(strpos($mad['tags'], $mySearch)) {
            // show results
            echo "<div class='comment_1'>$mad[title]</div>";
            continue 2;
        }   
    }   
}

答案 2 :(得分:1)

你可能在这里采取了一些向后的方法。您应该在查询中使用搜索标记,因此您无需返回整个表。您可能还应该将标记规范化为标记表和videos_tags表,它们表示它们之间的多对多关系。然后你会这样搜索:

SELECT * FROM
videos
INNER JOIN videos_tags ON videos.video_id = videos_tags.video_id
INNER JOIN tags ON videos_tags.tag_id = tags.tag_id
WHERE tags.tag_text IN ('tag 1', 'tag 2', etc.)

随着应用程序的增长,这将使您的模型更具可持续性。

答案 3 :(得分:0)

  

让这个脚本部分工作

那很好,但是,脚本就像怀孕一样:没有部分原因。一个系统是否有效,在各行之间并不多。

这里存在逻辑问题,原因是您的控制结构处理顺序错误。

正常程序是:

  1. 验证并处理输入数据。
  2. 处理数据,进行转换。在您的情况下,使用它从数据库中获取数据。
  3. 输出从商店获取的数据。
  4. 在你的脚本中,你将所有这三件事混合在一起,而不是一个接一个地完成:

    $tags_array = get_tags_array_from_input();
    
    $result = mysql_query_result_based_on_tags_array($tags_array);
    
    display_results($result);
    
    /**
     * exemplary only
     */
    function mysql_query_result_based_on_tags_array(array $tags)
    {
        $mask = "SELECT * FROM videos WHERE tags REGEXP '%s'";
        $sql  = sprintf($mask, implode('|', $tags));
    
        return mysql_query($sql);
    }