遍历POST数组以进行数据库插入

时间:2018-09-12 20:15:19

标签: php mysql

我正在尝试创建一个具有多个复选框的表单,将每个选中的复选框的值输入到mySQL数据库的单独行中。

这是我的HTML:

<form action="testsent.php" method="post" novalidate>
  <div id="currentWork">
<label for="currentWork">Mark all that apply.</label><br>
  <input type="checkbox" name="chk1[]" value="Bernards Township">Bernards Library<br>
  <input type="checkbox" name="chk1[]" value="Boonton Holmes">Boonton Library<br>
  <input type="checkbox" name="chk1[]" value="Butler">Butler Library<br>
  <input type="checkbox" name="chk1[]" value="Chatham">Chathams Library<br>
  <input type="checkbox" name="chk1[]" value="Chester">Chester Library<br>
  <input type="checkbox" name="chk1[]" value="Denville">Denville Library<br>
  <input type="checkbox" name="chk1[]" value="Dover">Dover Library<br>
  <input type="checkbox" name="chk1[]" value="East Hanover">East Hanover Library<br>
</div>
<input type="Submit" value="Submit" name="Submit"/>
</div>
</form>

这是我的PHP:

if(!empty($_POST['chk1'])) {
foreach($_POST['chk1'] as $check) {
        //echo $check;
        $sql="INSERT INTO $usertable (library) VALUES ('.$check.')";
 }
}

if(mysqli_query($link, $sql)) 
    {
        echo 'Thanks for submitting';
    } 
else {
        echo 'ERROR: Could not execute $sql.' . mysqli_error($link);
    }

这很工作,只是它仅输入检查的最终项目。如果同时选中了Boonton,Chester和Denville,则只会在表格中输入“ Denville”。

我认为有一个foreach循环会遍历复选框,但是我不确定我要去哪里。我没有收到任何错误消息。当我在stackoverflow上搜索此问题时,我单击了出现的每个链接。问题在于,完成这项工作的方式似乎太多了,而且这些问题中的大多数都被标记为信息不足或过于笼统。

如果您需要任何其他信息来帮助我解决此问题,我们将很乐意提供!我没有退缩。谢谢!

1 个答案:

答案 0 :(得分:1)

您正在循环外写入数据库。因此,唯一写入的值是经过循环的最后一个值。将您的插入内容移入循环。

if(!empty($_POST['chk1'])) {
    foreach($_POST['chk1'] as $check) {
        //echo $check;
        $sql="INSERT INTO $usertable (library) VALUES ('.$check.')";
        mysqli_query($link, $sql);
    }
}

您需要做的是使用准备好的语句来清理用户数据。由于查询仅发送到数据库一次,因此这将更加有效:

if (!empty($_POST["chk1"])) {
    $stmt = $mysqli->prepare("INSERT INTO $usertable (library) VALUES ?");
    foreach($_POST['chk1'] as $check) {
        $stmt->bind_param("s", $check);
        $stmt->execute();
    }
    $stmt->close();
}