1

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

4 回答 4

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

于 2012-12-18T19:55:35.057 回答
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;
        }   
    }   
}
于 2012-12-18T19:58:55.930 回答
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.)

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

于 2012-12-18T20:01:59.903 回答
0

让这个脚本部分工作

好吧,不过,脚本就像怀孕一样:没有部分。一个系统要么工作要么不工作,两行之间没有太多关系。

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

正常程序是:

  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);
}
于 2012-12-18T19:59:51.120 回答