Цикл по массиву POST для вставки базы данных

0

Я пытаюсь сделать форму, которая имеет несколько флажков, вводит значение каждого отмеченного флажка в строку 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. Проблема в том, что, похоже, существует так много разных способов сделать эту работу, и большинство из этих вопросов отмечены как недостаточно информативные или слишком общие.

Если вам нужна дополнительная информация, чтобы помочь мне решить эту проблему, я буду рад предоставить ее! Я ничего не держу. Спасибо!

  • 0
    Ну, для начала, вы ничего не пишете в свою базу данных. Во-вторых, вы сбрасываете предоставленные пользователем данные в запрос SQL. Хороший способ взломать!
  • 0
    Я не вижу элемент <form>
Показать ещё 7 комментариев
Теги:

1 ответ

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();
}
  • 0
    Это именно то, что я искал. Спасибо за информацию о дезинфекции пользовательских данных. Ввод идет как «.Denville». с точками по обе стороны. Я попробовал второй, очищенный код, и я получил эту ошибку: «Вызов функции-члена prepare () для null в /home/mainlib/public_html/subs/testsent.php в строке 29 '
  • 0
    Конечно, вам нужно убедиться, что $mysqli является правильно инициализированным соединением mysqli.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню