php 和 mysql 中用于搜索的多个复选框?

multiple checkboxes used for search in php and mysql?

这似乎是一个常见问题,因为我已经看到很多类似的问题。

然而,没有一个答案真正指出如何从 mysql 数据库进行 selecting,这就是我目前的问题。

基本上我有一个 table,我将搜索数据存储在其中。

看起来像这样:

id    blond   darkHair    busty     curvy
---------------------------------------------------

1     blond               busty

2             dark hair   busty     curvy

3     blond                         curvy

4     blond                         curvy

我有一个带有复选框的表单,如下所示:

<form action="search.php" method="post">
    <input name="keyword[]" type="checkbox" value="blond"  />
    <input name="keyword[]" type="checkbox" value="dark hair" />
    <input name="keyword[]" type="checkbox" value="busty"  />
    <input name="keyword[]" type="checkbox" value="curvy"  />
</form>

和 PHP 代码如下:

if(isset($_POST['keyword']))
{

    $keyword = $_POST['keyword'];

 foreach ($_POST['keyword'] as $keyword) {

   $keywordarray[] = mysqli_real_escape_string($conx, $keyword);


    }
   $keywords = implode (",", $keywordarray);

    $sql = "SELECT * FROM girlsStaff
            WHERE (`blond` LIKE '%".$keyword."%') OR (`darkHair` LIKE '%".$keyword."%') OR (`busty` LIKE '%".$keyword."%') OR (`thin` LIKE '%".$keyword."%')" or die();


    $query = mysqli_query($conx, $sql);

现在,除了将这段代码转换为PDO或prepared statement之外,还有一个问题我不明白!

我 select 有多少个复选框并不重要...它总是 returns 来自 mysql 数据库的最后一个 checked/selected 复选框值的结果... .

有什么我遗漏的吗?

我也在我的页面顶部做了 echo $keywords 以查看发送到页面的内容,我得到了所有正确发送的 selected/checked 框的值..所以我知道问题不存在。

如有任何帮助或建议,我们将不胜感激。

我认为从 $keyword 到 $keywords 的小改动将解决您的问题:) 现在你正在寻找像 $_POST['keyword'] 数组中的最后一个值这样的项目。

这一行:

$sql = "SELECT * FROM girlsStaff WHERE (`blond` LIKE '%".$keyword."%') OR (`darkHair` LIKE '%".$keyword."%') OR (`busty` LIKE '%".$keyword."%') OR (`thin` LIKE '%".$keyword."%')" or die();

如果您有列表 aaa、bbb、ccc....,您还应该使用 IN 而不是 LIKE,但是您将在这些字段中查找具有完全相同字符串的元素。

更改为 $keywords 后,您将拥有:

... WHERE (`blond` LIKE '%".$keywords."%')

也将不起作用,因为它意味着:

... WHERE (`blond` LIKE '%aaa,bbb,ccc%')

如果你想使用 like(如果数据库中的字段只包含数组中的字符串)那么我建议在 foreach 循环中构建你的查询。示例:

$sql = "SELECT * FROM girlsStaff WHERE ".
foreach ($_POST['keyword'] as $keyword) {
    $sql .= "(`blond` LIKE '%".$keyword."%') OR ";
}
//and here cut last four character " OR " part that will be unusefull

错别字:

$keywords = implode (",", $keywordarray);
        ^--- with an S

WHERE (`blond` LIKE '%".$keyword."%') 
                                ^--- without an S

您正在填充原始 $_POST['keyword'] 数组。字符串上下文中的数组是字面词 Array,因此您的查询实际上执行为

WHERE (`blond` LIKE '%Array%')

您需要动态构建查询。

<?php
$clause = " WHERE ";//Initial clause
$sql="SELECT * FROM `girlsStaff`  ";//Query stub
if(isset($_POST['submit'])){
    if(isset($_POST['keyword'])){
        foreach($_POST['keyword'] as $c){
            if(!empty($c)){
                $sql .= $clause."`".$c."` LIKE '%{$c}%'";
                $clause = " OR ";//Change  to OR after 1st WHERE
            }   
        }
    }
echo $sql;//Remove after testing
}
?>
<form method="POST" action="#">
<form action="search.php" method="post">
 Blond:   <input name="keyword[]" type="checkbox" value="blond"  />
 Dark Hair:   <input name="keyword[]" type="checkbox" value="dark hair" />
 Busty :  <input name="keyword[]" type="checkbox" value="busty"  />
 Curvy;   <input name="keyword[]" type="checkbox" value="curvy"  />
<input type="submit" name="submit" value="Submit">
</form>

示例查询

2 个复选框已填写

SELECT * FROM `girlsStaff` WHERE `dark hair` LIKE '%dark hair%' OR `curvy` LIKE '%curvy%'

4 人满

SELECT * FROM `girlsStaff` WHERE `blond` LIKE '%blond%' OR `dark hair` LIKE '%dark hair%' OR `busty` LIKE '%busty%' OR `curvy` LIKE '%curvy%'