implode
を使用しないでください 。これにより、フォーム内のすべてのコンマ区切りのリストが挿入する各行に配置され、チェックされているすべてのボックスに対してこれが繰り返されます。配列にインデックスを付けて、各行に1つのアイテムを挿入するだけです。
ただし、フォームにチェックボックスがある場合は、チェックされているものだけが送信されます。この結果、$_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に価格を入れるのは悪い考えのようです。ユーザーがフォームを送信する前にWebインスペクターを使用してHTMLを変更することを妨げるものは何もないため、価格を下げることができます。フォームを処理するときにデータベースから価格を取得する必要があります。
また、元のコードではMySQLiを使用してデータベース接続を開いたが、mysql_query
を使用して挿入を試みたことに注意してください。 $conn->query()
の代わりに 。そのようなAPIを混在させることはできません。 myql_query
mysql_connect
で接続を開いた場合にのみ使用できます 。