此脚本部分正常工作,但如果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>";
}
}
}
我们非常感谢任何帮助。
答案 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)
让这个脚本部分工作
那很好,但是,脚本就像怀孕一样:没有部分原因。一个系统是否有效,在各行之间并不多。
这里存在逻辑问题,原因是您的控制结构处理顺序错误。
正常程序是:
在你的脚本中,你将所有这三件事混合在一起,而不是一个接一个地完成:
$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);
}