是否可以在嵌套的IF语句中使用单独的INSERT语句将不同的数据添加到两个不同的表中?

时间:2019-05-09 16:40:40

标签: php mysql

我有一个系统,有人可以订购和订购多个相同或不同的产品。我要将一些购物车数据(订单的概述)存储到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>

我认为语句如何嵌套可能是个问题?

任何帮助将不胜感激!

1 个答案:

答案 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)