我有一个系统,有人可以订购和订购多个相同或不同的产品。我要将一些购物车数据(订单的概述)存储到orders
表中,并且要将特定商品数据存储到另一个表order_item
(例如quantity
,{{ 1}}等)。对product_id
的第一个查询正在工作,但是以某种方式,第二个查询不会对第二个表进行INSERT INTO orders
。为了插入第二张表,我还需要从INSERT INTO
表中找到最高的id
号,以便可以将其添加到orders
表中。
以下是SQL语句:
order_item
所有变量都正确命名,但将它们放在此处毫无意义。也许值得一提的是,所有变量都是通过$ _POST从提交表单的另一页上获取的。
为了找到最大的if(empty($hNum) || empty($street) || empty($city) || empty($county) || empty($postcode) || empty($country)){
header("Location: ../shop/checkout.php?error=emptyaddressfields");
exit();
}
else {
$sqlO = "INSERT INTO orders (customer_id, order_date, order_status, num_items, total_cost)
VALUES ('$customer_id', CURRENT_TIMESTAMP, 'Order Placed', '$num_items', '$total_cost')";
$stmt = mysqli_stmt_init($conn);
if(!mysqli_stmt_prepare($stmt, $sqlO)) {
header("Location: ../shop/checkout.php?error=sqlerror");
exit();
}
else { //if statement here for second sql insert
$sqlMaxId = "SELECT order_id FROM orders ORDER BY order_id DESC LIMIT 1";
$sqlOI = "INSERT INTO order_item (order_id, product_id, quantity)
VALUES ('$sqlMaxId', '$productID', '$productQty')";
$result = mysqli_stmt_init($conn);
if(!mysqli_stmt_prepare($result, $sqlOI)) {
header("Location: ../shop/checkout.php?error=sqlerror3");
}
else {
mysqli_stmt_execute($stmt);
unset($_SESSION['shopping_cart']);
header("Location: ../shop/account.php");
exit();
}
}
}
数,我尝试使用id
,但似乎不起作用,也许是因为整个语句无法正常工作,但这绝对可以工作。 / p>
我认为语句如何嵌套可能是个问题?
任何帮助将不胜感激!
答案 0 :(得分:0)
$sqlMaxId = "SELECT order_id FROM orders ORDER BY order_id DESC LIMIT 1";
$sqlOI = "INSERT INTO order_item (order_id, product_id, quantity)
VALUES ('$sqlMaxId', '$productID', '$productQty')";
这里您要插入实际的字符串$sqlMaxID
即使您喜欢下面的方法,所以将包含变量内容,$ sqlMaxId仍表示字符串"select ..."
,而不是该查询的结果。
$sqlOI = "INSERT INTO order_item (order_id, product_id, quantity)
VALUES (" $sqlMaxId "," $productID "," $productQty ")";
嵌套的Ifs ==恶魔。同样,这需要在一个事务中完成。如果两个客户同时提交并且第二条sql语句运行时最大ID已更改为下一个客户,将会发生什么情况? 您应该做的是创建一个存储过程,该过程将处理所有插入逻辑。您的应用程序不应该知道或关心数据库中数据的组织方式。因此,在新的存储过程中,可以使用输出子句将刚插入表1(包括标识列)中的数据输出到表变量中,该变量仅包含成功插入的数据。然后,您可以连接到该表变量以获取第二次插入所需的ID。输出子句如下所示:
DECLARE @NewItem Table(ItemID int)
insert into Table1(Some stuff)
OUTPUT Inserted.ID
INTO @NewIssue
Values(1,2,3, etc)