PHP вставляет несколько флажков и массивов текстовых полей в базу данных MySQL

У меня возникают проблемы с результатами массива в моем php. Моя первая проблема заключается в следующем:

введите описание изображения здесь

Он показывает все, даже если флажок не установлен. Моя вторая проблема заключается в том, что она не будет вставлять значения в базу данных, даже если она подключена к базе данных (как вы можете видеть на предыдущем снимке экрана, она говорит «успешно подключена»).

Это моя html-форма:

<form method="POST"> <input type="hidden" name="item[]" value="cupcake"> <input type="text" name="items" value="cupcake" readonly><br> <b>Price :</b> <span name="price" value="3.00">$17.00</span><br> Quantity: <input tabindex="1" name="quantity[]" min="0" max="5" type="number" class="quantity" value="1" /><br> <input tabindex="1" name="checkbox[]" type="checkbox" value="17" /><span>Add to Cart</span></label></div></div></td><br> <input type="hidden" name="item[]" value="cake"> <input type="text" name="items" value="cake" readonly><br> <b>Price :</b> <span name="price" value="20.00">$20.00</span><br> Quantity: <input tabindex="1" name="quantity[]" min="0" max="5" type="number" class="quantity" value="1" /><br> <input tabindex="1" name="checkbox[]" type="checkbox" value="20" /><span>Add to Cart</span></label></div></div></td><br> <input type="submit" name="insertBT"><br> </form> 

PHP:

 if(isset($_POST['insertBT'])) { class db_conn { public function create_conn($servername, $username, $password, $db) { global $conn; $conn = new mysqli ($servername, $username, $password, $db); } public function check_conn() { global $conn; if($conn->connect_error) { die ("Connection Failed : " . $conn->connect_error); } else { echo ("Connected Successfully <br>"); } } public function insert() { if(isset($_POST['checkbox'])) { foreach($_POST['checkbox'] as $check) { $check = implode(',', $_POST['checkbox']); $name = implode(',', $_POST['item']); $quantity = implode(',', $_POST['quantity']); } echo $check . "<br>"; echo $name . "<br>"; echo $quantity . "<br>"; mysql_query("INSERT INTO purchases(Product, Quantity, Price) VALUES('$name', '$quantity','$check')"); } } } $obj1 = new db_conn; $obj1->create_conn("localhost","root","", "dbtest"); $obj1->check_conn(); $obj1->insert(); } 

Вы не должны использовать implode . Это помещает разделенный запятыми список всего в форме в каждую строку, которую вы вставляете, и повторяет это для каждого проверенного окна. Вы должны просто вставить один элемент в каждую строку, индексируя массивы.

Однако, когда у вас есть флажок в форме, он отправляет только те, которые были отмечены. Результатом этого является то, что индексы массива $_POST['checkbox'] не будут совпадать с соответствующими $_POST['item'] и $_POST['quantity'] . Вам нужно указать явные индексы в именах checkbox чтобы их можно было связать.

 <form method = "POST"> <input type = "hidden" name = "item[]" value = "cupcake"> <input type = "text" name = "items" value = "cupcake" readonly><br> <b>Price :</b> <span name = "price" value = "3.00">$17.00</span><br> Quantity: <input tabindex="1" name="quantity[]" min="0" max="5" type="number" class="quantity" value="1" /><br> <input tabindex="1" name="checkbox[0]" type="checkbox" value="17" /><span>Add to Cart</span></label></div></div></td><br> <input type = "hidden" name = "item[]" value = "cake"> <input type = "text" name = "items" value = "cake" readonly><br> <b>Price :</b> <span name = "price" value = "20.00">$20.00</span><br> Quantity: <input tabindex="1" name="quantity[]" min="0" max="5" type="number" class="quantity" value="1" /><br> <input tabindex="1" name="checkbox[1]" type="checkbox" value="20" /><span>Add to Cart</span></label></div></div></td><br> <input type = "submit" name = "insertBT"><br> </form> 

Тогда ваш PHP-код может выглядеть следующим образом:

 $stmt = $conn->prepare("INSERT INTO purchases (Product, Quantity, Price) VALUES (?, ?, ?)"); $stmt->bind_param("sis", $name, $quantity, $price); foreach ($_POST['checkbox'] as $i => $price) { $name = $_POST['name'][$i]; $quantity = $_POST['quantity'][$i]; $stmt->execute(); } 

Кстати, размещение цен в вашем HTML кажется плохой идеей. Ничто не мешает пользователю изменять HTML с помощью веб-инспектора перед отправкой формы, чтобы они могли снизить цену. Вы должны получить цены из базы данных при обработке формы.

Также обратите внимание, что в исходном коде вы открыли соединение с базой данных с помощью MySQLi, но затем вы попытались сделать вставку, используя mysql_query а не $conn->query() . Вы не можете смешивать такие API; myql_query можно использовать только при открытии соединения с mysql_connect .