我想插入购买细节等内容。 我创建了两个表,purchase&purchase_items。 因此,每个购买记录可以有多个项目。 我可以在购买表中插入一条记录,但我需要的是使用添加到列表中的项目将行插入购买。 代码如下
$stmt = $conn->prepare("INSERT INTO `purchase` (`purchaseRef`, `vendorName`, `date`) VALUES (?, ?, ?)"); $stmt->bind_param("sss", $reference, $vendorName, $date); $reference = $_POST["txtRef"]; $vendorName = $_POST["vendorName"]; $date = date("Y-m-d"); if($stmt->execute()) { $lastID = $stmt->insert_id; // i want to add unlimited items, i wrote as follows foreach ($_POST as $key => $value) { $stmt2 = $conn->prepare("INSERT INTO `purchase_items` (`prchseID`, `ctgryNo`, `prdctID`, `quantity`, `price`) VALUES (?, ?, ?, ?, ?)"); $stmt2->bind_param("sssss", $lastID, $ctgryID, $prdID, $qnty, $price); $param_name = "ctgryID"; if(substr($key, 0, strlen($param_name)) == $param_name) { ctgryID=$value; } $param_name2 = "prdID"; if(substr($key, 0, strlen($param_name2)) == $param_name2) { $prdID=$value; } $param_name3 = "qnty"; if(substr($key, 0, strlen($param_name3)) == $param_name3) { $qnty=$value; } $param_name4 = "price"; if(substr($key, 0, strlen($param_name4)) == $param_name4) { $price=$value; } if(!$stmt2->execute()) { echo 'error: '.$stmt2->error; exit(); } } }请帮忙
I would like to insert something like purchase details. I have created two tables, purchases & purchase_items. So each purchase record can have more than 1 item. I can insert one record into purchase table, but what i need is to insert rows into purchase with items added to the list. Code is below
$stmt = $conn->prepare("INSERT INTO `purchase` (`purchaseRef`, `vendorName`, `date`) VALUES (?, ?, ?)"); $stmt->bind_param("sss", $reference, $vendorName, $date); $reference = $_POST["txtRef"]; $vendorName = $_POST["vendorName"]; $date = date("Y-m-d"); if($stmt->execute()) { $lastID = $stmt->insert_id; // i want to add unlimited items, i wrote as follows foreach ($_POST as $key => $value) { $stmt2 = $conn->prepare("INSERT INTO `purchase_items` (`prchseID`, `ctgryNo`, `prdctID`, `quantity`, `price`) VALUES (?, ?, ?, ?, ?)"); $stmt2->bind_param("sssss", $lastID, $ctgryID, $prdID, $qnty, $price); $param_name = "ctgryID"; if(substr($key, 0, strlen($param_name)) == $param_name) { ctgryID=$value; } $param_name2 = "prdID"; if(substr($key, 0, strlen($param_name2)) == $param_name2) { $prdID=$value; } $param_name3 = "qnty"; if(substr($key, 0, strlen($param_name3)) == $param_name3) { $qnty=$value; } $param_name4 = "price"; if(substr($key, 0, strlen($param_name4)) == $param_name4) { $price=$value; } if(!$stmt2->execute()) { echo 'error: '.$stmt2->error; exit(); } } }Please help
最满意答案
这里你的问题是当你不需要的时候迭代$_POST 。
你的$_POST已经拥有你需要插入的所有值,你可以在不使用foreach情况下访问它们,只需使用[] :
$lastID = $stmt->insert_id; $stmt2 = $conn->prepare("INSERT INTO `purchase_items` (`prchseID`, `ctgryNo`, `prdctID`, `quantity`, `price`) VALUES (?, ?, ?, ?, ?)"); $stmt2->bind_param("sssss", $lastID, $_POST['ctgryID'], $_POST['prdID'], $_POST['qnty'], $_POST['price'] ); if (!$stmt2->execute()) { echo 'error: '.$stmt2->error; exit(); }更新 :更多的产品与他们的价格你inputs应使用[]符号:
First product <input type="text" name="ctgryID[]" value="" /> <input type="text" name="prdID[]" value="" /> <input type="text" name="qnty[]" value="" /> <input type="text" name="price[]" value="" /> Second product <input type="text" name="ctgryID[]" value="" /> <input type="text" name="prdID[]" value="" /> <input type="text" name="qnty[]" value="" /> <input type="text" name="price[]" value="" /> Third product <input type="text" name="ctgryID[]" value="" /> <input type="text" name="prdID[]" value="" /> <input type="text" name="qnty[]" value="" /> <input type="text" name="price[]" value="" /> And more在服务器端,您使用foreach如下所示:
// print_r your `$_POST` and you'll see subarrays there $stmt2 = $conn->prepare("INSERT INTO `purchase_items` (`prchseID`, `ctgryNo`, `prdctID`, `quantity`, `price`) VALUES (?, ?, ?, ?, ?)"); $stmt2->bind_param("sssss", $lastID, $ctgryID, $prdID, $qnty, $price ); foreach ($_POST['ctgryID'] as $index => $value) { $ctgryID = $value; // here's the magic - use items from other // $_POST subarrays with the same indexes $prdID = $_POST['prdID'][$index]; $qnty = $_POST['qnty'][$index]; $price = $_POST['price'][$index]; if (!$stmt2->execute()) { echo 'error: '.$stmt2->error; exit(); } }Your problem here is that you iterate over $_POST when you don't have to.
Your $_POST already have all the values you need to insert and you can access them without foreach, just using []:
$lastID = $stmt->insert_id; $stmt2 = $conn->prepare("INSERT INTO `purchase_items` (`prchseID`, `ctgryNo`, `prdctID`, `quantity`, `price`) VALUES (?, ?, ?, ?, ?)"); $stmt2->bind_param("sssss", $lastID, $_POST['ctgryID'], $_POST['prdID'], $_POST['qnty'], $_POST['price'] ); if (!$stmt2->execute()) { echo 'error: '.$stmt2->error; exit(); }Update: for more products with their prices you form inputs should use [] notation:
First product <input type="text" name="ctgryID[]" value="" /> <input type="text" name="prdID[]" value="" /> <input type="text" name="qnty[]" value="" /> <input type="text" name="price[]" value="" /> Second product <input type="text" name="ctgryID[]" value="" /> <input type="text" name="prdID[]" value="" /> <input type="text" name="qnty[]" value="" /> <input type="text" name="price[]" value="" /> Third product <input type="text" name="ctgryID[]" value="" /> <input type="text" name="prdID[]" value="" /> <input type="text" name="qnty[]" value="" /> <input type="text" name="price[]" value="" /> And moreOn server side you use foreach like this:
// print_r your `$_POST` and you'll see subarrays there $stmt2 = $conn->prepare("INSERT INTO `purchase_items` (`prchseID`, `ctgryNo`, `prdctID`, `quantity`, `price`) VALUES (?, ?, ?, ?, ?)"); $stmt2->bind_param("sssss", $lastID, $ctgryID, $prdID, $qnty, $price ); foreach ($_POST['ctgryID'] as $index => $value) { $ctgryID = $value; // here's the magic - use items from other // $_POST subarrays with the same indexes $prdID = $_POST['prdID'][$index]; $qnty = $_POST['qnty'][$index]; $price = $_POST['price'][$index]; if (!$stmt2->execute()) { echo 'error: '.$stmt2->error; exit(); } }更多推荐
发布评论