sql >> Databasteknik >  >> RDS >> Mysql

PHP infogar flera kryssrutor OCH textboxarrayer i MySQL Database

Du bör inte använda implode . Det sätter en kommaseparerad lista över allt i formuläret i varje rad som du infogar, och upprepar detta för varje ruta som är markerad. Du bör bara infoga ett objekt i varje rad genom att indexera arrayerna.

Men när du har en kryssruta i ett formulär skickar den bara in de som är markerade. Resultatet av detta är att indexen för $_POST['checkbox'] array matchar inte motsvarande $_POST['item'] och $_POST['quantity'] element. Du måste sätta explicita index i checkbox namn så att du kan relatera dem.

<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>

Då kan din PHP-kod vara så här:

$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();
}

BTW, att sätta priserna i din HTML verkar vara en dålig idé. Inget hindrar användaren från att ändra HTML med hjälp av webbinspektören innan de skickar in formuläret, så att de kan sänka priset. Du bör få priserna från databasen när du bearbetar formuläret.

Lägg också märke till att du i din ursprungliga kod öppnade databasanslutningen med MySQLi, men sedan försökte du infoga med mysql_query istället för $conn->query() . Du kan inte blanda API:er på det sättet; myql_query kan endast användas när du öppnar anslutningen med mysql_connect .




  1. SQLite grupperar efter/antal timmar, dagar, veckor, år

  2. Där villkor för sammanfogat bord i Sequelize ORM

  3. Sammanfoga radvärden T-SQL

  4. Oracle (gamla?) Joins - Ett verktyg/manus för konvertering?