多个标签搜索查询仅通过1个标签匹配获得结果

轴突

在我的桌子上

        posts                        tags
[  id    -     title  ]         [pid  -  tag]
[  1     -     echo   ]         [ 1   -  PHP]
[  2     -     for    ]         [ 1   -  PDO]
                                [ 2   -  PHP]

我做这个查询

if(isset($_POST['submit'])){
    $tag = implode(",",$_POST['tags']);
    $query = "
    SELECT a.title FROM posts a
    INNER JOIN tags b ON a.id = b.pid
    WHERE b.tag IN (:tag)
    ";
    $stmt = $pdo->prepare($query);
    $stmt->execute(['tag' => $tag]);
    while($row = $stmt->fetch()){
        echo $row['title'];
    }
}

这是发生了什么

如果[PHP]选择,我会得到结果[echo - for]

如果[PDO]选择,我会得到结果[echo]

但是,如果我选择了该选项[php and pdo],我将一无所获,而且我期望得到结果echo我该如何解决我的查询?

道格

不幸的是,即使您现在认为他们已经涵盖了这一点。不,您不能将数组绑定到准备好的语句上。

最终,您有2个选项,将其作为字符串直接提供给查询或使用 FIND_IN_SET

选项1:

$tags = implode(",",$_POST['tags']);
$inString = implode(',', array_fill(0, count($tags), '?'));
$query = $db->prepare('
    SELECT a.title FROM posts a
    INNER JOIN tags b ON a.id = b.pid
    WHERE b.tag IN(' . $inString . ')'
    );

foreach ($_POST['tags'] as $key => $tag){
    $query->bindValue(($key+1), $tag);
}
$query->execute();

选项2:

$tags = implode(",",$_POST['tags']);
$query = $db->prepare('
    SELECT a.title FROM posts a 
    INNER JOIN tags b ON a.id = b.pid
    WHERE FIND_IN_SET(b.tag, :array)'
    );
$query->bindParam('array', $tags);
$query->execute();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章