我有一个动态添加表单字段功能,可以按顺序将多个库存添加到数据库中。
但是我无法为包含许多股票的订单插入相同的order_id。我需要使用order_id打印订单明细
ordertable
--------------------------------------------------------
| order_id | order_item_id | item_name | item_quantity |
--------------------------------------------------------
stocktable
-----------------------------------------------------
| item_id | item_name | item_descript | item_quantity |
-----------------------------------------------------
<?php
require_once('../config.php');
$number = count($_POST["item_name"]);
$item_name=$_POST['item_name'];
$item_quantity=$_POST['item_quantity'];
$order_id = uniqid();
if($number > 0)
{
for($i=0; $i<$number; $i++)
{
if($item_name[$i]!="" && $item_quantity[$i]!="")
{
$sql = "INSERT INTO ordertable(order_id,item_name,item_quantity)
VALUES('$order_id','$item_name[$i]','$item_quantity[$i]')";
mysqli_query($conn, $sql);
}
}
}
$conn->close();
?>
答案 0 :(得分:1)
您的架构需要进行一些更改。 stocktable
包含库存商品列表。 ordertable
应该包含订单列表,而您缺少orderdetailtable
,其中包含给定订单的每个库存商品。
问题在于,在您的架构中,您拥有订单表,主键为order_id
,并且您希望将所有订单行项目放在同一个order_id
中。这不会起作用。
创建一个新表来保存订单行项目,并使订单表包含订单特定信息,例如客户,日期等。订单明细表可以看作订单和库存之间的链接表项目
ordertable
------------------------------
| order_id | order_date | ...
------------------------------
orderdetailtable
----------------------------------------------------------
| order_detail_id | order_id | stock_id | order_quantity |
----------------------------------------------------------
stocktable
--------------------------------------------------------
| stock_id | item_name | item_descript | item_quantity |
--------------------------------------------------------
<强>更新强> 上面的代码也需要改变,以满足新的数据库结构。
...
if($number > 0)
{
$sql = "INSERT INTO ordertable(order_id, ...) VALUES('$order_id', ...";
mysqli_query($conn, $sql);
for($i=0; $i<$number; $i++)
{
$order_detail_id = uniqid();
if($item_name[$i]!="" && $item_quantity[$i]!="")
{
$sql = "INSERT INTO orderdetailtable(order_detail_id,order_id,stock_id,item_quantity)
VALUES('$order_detail_id','$order_id','$item_id[$i]','$item_quantity[$i]')";
mysqli_query($conn, $sql);
}
}
...
答案 1 :(得分:1)
问题在于您使用的uniqid()
由于多种原因而不适合表ID,但问题的相关问题是它将返回而不是整数但是像这样的字母数字字符串:
59f9a69367e7f
当您尝试将该值用作order_id
MySQL时,尝试将其转换为停在第一个非数字字符处的数字,因此您总是得到&#34; 59&#34;。
解决此问题的最简单方法是使用AUTO_INCREMENT
定义order_id
列,这样MySQL将自动为新行生成唯一标识。如果您需要获取该ID以供日后使用,可以使用mysqli_insert_id()
。
请注意,在具有自动递增ID的表中插入时,您会跳过列列表中的id列,在您的情况下,您将使用:
INSERT INTO ordertable (item_name,item_quantity)
最后一点,您的代码容易受到SQL injection 的影响,您应该使用mysqli_prepare()
和mysqli_stmt_bind_param()
。