Я пытаюсь сделать форму, которая имеет несколько флажков, вводит значение каждого отмеченного флажка в строку saeparate в моей базе данных 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);
}
Это WORKING, за исключением того, что он вводит только последний элемент. Если Boonton будет проверен, а также Честер и Денвилл, он войдет только в "Denville" в форму.
Я думал, что цикл foreach будет перебирать флажки, но я не уверен, где я ошибаюсь. Я не получаю сообщений об ошибках. Я нажал на каждую ссылку, которая появляется при поиске этой проблемы в stackoverflow. Проблема в том, что, похоже, существует так много разных способов сделать эту работу, и большинство из этих вопросов отмечены как недостаточно информативные или слишком общие.
Если вам нужна дополнительная информация, чтобы помочь мне решить эту проблему, я буду рад предоставить ее! Я ничего не держу. Спасибо!
Вы пишете базу данных вне цикла. Таким образом, единственное записанное значение - это последнее, которое прошло через цикл. Переместите вашу вставку в петлю.
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();
}
$mysqli
является правильно инициализированным соединением mysqli.
<form>