Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-使用多个复选框选项构建SQL查询_Php_Sql - Fatal编程技术网

PHP-使用多个复选框选项构建SQL查询

PHP-使用多个复选框选项构建SQL查询,php,sql,Php,Sql,我使用表单和POST方法构建了一个SQL查询。我使用复选框,可以有多个值,所以当我有多个选择时,我想插入一个或 # Form <form action="" method="post"> <input id="01" name="choice[]" type="checkbox" value="01"> <input id="02" name="choice[]" type="checkbox" value="02"> <inpu

我使用表单和
POST
方法构建了一个
SQL
查询。我使用复选框,可以有多个值,所以当我有多个选择时,我想插入一个

# Form
<form action="" method="post">
    <input id="01" name="choice[]" type="checkbox" value="01">
    <input id="02" name="choice[]" type="checkbox" value="02">
    <input id="03" name="choice[]" type="checkbox" value="03">
    <input type="submit"  name="btSubmit"/>
</form>

# Query
if(isset($_POST["btSubmit"]) and !empty($_POST['choice'])) {

    foreach($_POST["choice"] as $value_choice) echo  "type = '$value_choice' OR ";

    $sql = $db->query("SELECT name, type
                   FROM data.myData 
                   WHERE '$value_choice'
                   GROUP BY name, type
                   ORDER BY name, type");

}

如何解决此问题?

请按以下方式更改您的
foreach

foreach($_POST["choice"] as $value_choice) {
    if ($value_choice === end($_POST["choice"]))
    {
        echo  "type = '$value_choice'";
    }
    else
    {
        echo  "type = '$value_choice' OR ";
    }
}

您可以在

比如:

 SELECT name, type FROM data.myData
 WHERE type IN ('01','02','03')
 GROUP BY name, type

希望这将帮助您:

$orClause = "";
$or = "";
foreach($_POST["choice"] as $value_choice) {
    $orClause .= $or . " type = '$value_choice' ";
    $or = " OR ";
}

$sql = $db->query("SELECT name, type
                   FROM data.myData 
                   WHERE $orClause
                   GROUP BY name, type
                   ORDER BY name, type");

使用所有复选框值创建一个逗号分隔的字符串,如下所示:

$all_ck_box = implode(',', $_POST['choice']);
$sql = $db->query("SELECT name, type
               FROM data.myData 
               WHERE type IN (".
               implode(',', $_POST["choice"])
               .") GROUP BY name, type
               ORDER BY name, type");
}
然后将其与mysql查询的
where in
子句一起使用

SELECT name, type FROM data.myData
 WHERE type IN ($all_ck_box)
 GROUP BY name, type
因此,您的更新代码将是:

if(isset($_POST["btSubmit"]) and !empty($_POST['choice'])) {

    $all_ck_box = implode(',', $_POST['choice']);
    $sql = $db->query("SELECT name, type
               FROM data.myData 
               WHERE type IN (".$all_ck_box.")
               GROUP BY name, type
               ORDER BY name, type");
}

正如@Rahul Mukherjee所建议的,您可以做如下事情:

$all_ck_box = implode(',', $_POST['choice']);
$sql = $db->query("SELECT name, type
               FROM data.myData 
               WHERE type IN (".
               implode(',', $_POST["choice"])
               .") GROUP BY name, type
               ORDER BY name, type");
}

如果未选择任何选项且未在条件中处理,则会引发错误。您只能为此编写检查条件!希望这会有所帮助我还想指出,我认为(到目前为止)大多数答案对SQL注入问题是开放的。虽然假设只能传递有效值,但为了恶意目的而发明自己的值并不太困难。@GeoGyro嗨,我刚刚注意到-Himanshu Upadhyay-在我做一分钟左右的事情之前回答了你的问题,所以请随意接受他的答案,而不是我的。@AmrAly,非常感谢您推荐我的答案。@himanshhuupadhyay不客气;)@奈杰伦:你如何防止这种情况发生?这是一个很好的方法,但有些引语不见了
$all-ck\u-box
类似于
01,02,03
,对于
SQL
而言,它必须是
'01'、'02'、'03'
才能尊重
SQL
引用
$all-ck\u-box=“””。内爆(“,”,$\u POST['choice'])。"'";一个好的答案总是会有一个解释,说明做了什么以及为什么这样做,不仅是为了OP,而且是为了未来的访客。