Non dovresti usare implode
. Ciò inserisce un elenco separato da virgole di tutto nel modulo in ogni riga che inserisci e lo ripete per ogni casella selezionata. Dovresti semplicemente inserire un elemento in ogni riga, indicizzando gli array.
Tuttavia, quando hai una casella di controllo in un modulo, invia solo quelli che sono selezionati. Il risultato è che gli indici del $_POST['checkbox']
l'array non corrisponderà al corrispondente $_POST['item']
e $_POST['quantity']
elementi. Devi inserire indici espliciti nella checkbox
nomi in modo da poterli mettere in relazione.
<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>
Quindi il tuo codice PHP può essere così:
$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();
}
A proposito, inserire i prezzi nel tuo HTML sembra una cattiva idea. Niente impedisce all'utente di modificare l'HTML utilizzando l'ispettore web prima di inviare il modulo, in modo da poter abbassare il prezzo. Dovresti ottenere i prezzi dal database durante l'elaborazione del modulo.
Inoltre, nota che nel tuo codice originale hai aperto la connessione al database usando MySQLi, ma poi hai provato a fare l'inserimento usando mysql_query
invece di $conn->query()
. Non puoi mescolare API in questo modo; myql_query
può essere utilizzato solo quando apri la connessione con mysql_connect
.