【问题标题】:PHP Multi-tag searchPHP 多标签搜索
【发布时间】:2012-12-06 02:26:35
【问题描述】:

让这个脚本部分工作,但如果 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>";
    }
  }
}

非常感谢任何帮助。

【问题讨论】:

  • 为什么在 foreach 循环中使用查询 SELECT *?您只是为$array 的每个实例选择所有内容

标签: php search tags


【解决方案1】:

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

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.)

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

【讨论】:

    【解决方案2】:

    你可以稍微改变一下然后做:

    $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_* 等效函数,因为它们已被弃用。我还将您的代码减少到只有一个循环,并将搜索词添加到您的查询中

    【讨论】:

      【解决方案3】:

      让这个脚本部分工作

      这很好,但是,脚本就像怀孕一样:没有部分。一个系统要么工作要么不工作,字里行间不多。

      这里有一个逻辑问题,是由于控制结构的处理顺序错误造成的。

      正常程序是:

      1. 验证和处理输入数据。
      2. 处理数据,转换它。在您的情况下,使用它从数据库中获取数据。
      3. 输出从存储中获取的数据。

      在您的脚本中,您将所有这三件事混合在一起,而不是一个接一个地做:

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

      【讨论】:

      • 当我阅读这个问题时,我必须假设数据库列 tags 是一个 VARCHAR 列。标签可能保存在一个-whatever-分隔的列表中。 IN() 语句不起作用
      • @hek2mgl:在这种情况下,对,你说的很有道理。那么 IN 不是选择的工具,使用 REGEXP 作为(琐碎的)示例。
      【解决方案4】:

      这应该可以工作

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-23
        • 2012-08-24
        • 1970-01-01
        • 2012-02-04
        • 1970-01-01
        • 2012-06-04
        相关资源
        最近更新 更多