Nie powinieneś używać implode
. W ten sposób w każdym wstawianym wierszu umieszczana jest rozdzielona przecinkami lista wszystkiego, co znajduje się w formularzu, i powtarza to dla każdego zaznaczonego pola. Powinieneś po prostu wstawić jeden element w każdym wierszu, indeksując tablice.
Jeśli jednak masz pole wyboru w formularzu, przesyła tylko te, które są zaznaczone. Wynikiem tego jest to, że indeksy $_POST['checkbox']
tablica nie pasuje do odpowiedniego $_POST['item']
i $_POST['quantity']
elementy. Musisz umieścić wyraźne indeksy w checkbox
nazwy, abyś mógł je powiązać.
<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>
Twój kod PHP może wyglądać tak:
$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();
}
Przy okazji, umieszczanie cen w kodzie HTML wydaje się złym pomysłem. Nic nie stoi na przeszkodzie, aby użytkownik modyfikował kod HTML za pomocą inspektora internetowego przed przesłaniem formularza, aby mógł obniżyć cenę. Powinieneś uzyskać ceny z bazy danych podczas przetwarzania formularza.
Zauważ również, że w oryginalnym kodzie otworzyłeś połączenie z bazą danych za pomocą MySQLi, ale potem próbowałeś wykonać wstawianie za pomocą mysql_query
zamiast $conn->query()
. Nie możesz mieszać interfejsów API w ten sposób; myql_query
można użyć tylko po otwarciu połączenia za pomocą mysql_connect
.