【问题标题】:How do I loop through an INSERT INTO statement如何循环通过 INSERT INTO 语句
【发布时间】:2016-09-16 17:23:52
【问题描述】:

我遇到的问题是在 while 语句的每个循环期间触发 INSERT INTO Mysql 语句。

根据 echo 返回正确的次数,它正确循环,但是 INSERT INTO 只工作了 1 次。

基本上问题是:“我如何使用 PHP 或 SQL 语句循环遍历这个 SQL INSERT statement

提前致谢

编辑:作为一个绝对的甜甜圈,我没有意识到我已经为 orderID 设置了一个主键,它一直在工作。只是不允许 orderID 重复。

感谢您的帮助

<?php
if(isset($_GET['checkout']))
{
$sql="SELECT * FROM cart WHERE userID =".$_SESSION['user'];
$query= mysqli_query($conn,$sql);
while ($row = mysqli_fetch_array($query)) {
            $querys= "INSERT INTO `orderdetail`(`orderID`, `selectionID`) VALUES (LAST_INSERT_ID(),{$row['cardchoiceID']})";
              $performit = $conn->query($querys);
                echo("testing");
            }
}
?>

【问题讨论】:

  • 你应该做一个“for each”循环。
  • Object OrientatedProcedural 代码的奇怪组合 - 但 Insert 语句似乎使用上一个插入的 id 更新 - 这真的是预期的效果吗?
  • 您可能会多次插入它,但您将 orderID 设置为第一个循环后的最后一个 orderdetail ID
  • last_insert_id 从名为 orders 的表中获取 orderID,以便它们与同一订单中的其他项目匹配。所以在这个 orderDetails 表中,有所有订购过的商品,旁边有一个订单 ID。即使它只是一个随机数,尽管购物车中有 4 个,但它仍然只在表中生成 1 个插入项目
  • LAST_INSERT_ID() 总是从完成的最后一个 INSERT 中获取最后一个插入 ID。这意味着在第一次通过后它不再是您的订单 ID。

标签: php mysql sql mysqli sql-insert


【解决方案1】:

您可以通过从一个选择语句插入来优化该方法(将其称为从一个表到另一个表的“迁移”):

"INSERT INTO orderdetail(selectionID, orderID)
  SELECT selectionID,orderID FROM cart WHERE userID =".$_SESSION['user'];

参考:Mysql Doc

【讨论】:

  • 你打败了我! @Ka_lin:D
  • 我打字很快,碰巧我分配了:P,纯粹和快乐的编码
  • 我认为他不希望 orderID 自动递增,因为我猜它是一个外键,并且在上面的某些代码中插入了一个订单。
  • @cmorrissey 是的,这是正确的,我不能将 orderID 与 order 表连接起来,因为它将它连接到用户,并且同一订单的所有项目都将具有相同的 orderID
  • 我已经更新了我的答案,从购物车表中插入相同的 orderID,这样它们就不会不同了
【解决方案2】:

Ka_lin 的回答很好,但您的订单没有存储用户/购物车详细信息?我看他们之间没有关系

通常购物车的流量是

  1. 用户将一些商品添加到购物车(购物车有 id)
  2. 用户结帐和购物车变成一个订单(使用购物车中的商品生成订单 ID)

    insert into orders(cart_id,item_id,item_qty,item_price,create_datetime) select cart_id,item_id,item_qty,item_price,now() from carts;

  3. 然后更新 cart_status 以将此购物车标记为“已完成”,以确保我们在该用户返回时创建一个新购物车

    update carts set cart_status = 'ordered' where user_id = {$user_id};

  4. 继续处理订单!

================

在看过 OP cmets 后编辑

也许这种方式对你有用

  1. 有一个order_header(存储通用信息 - 如订单类型、地址、时间戳和用户)和order_detail(存储项目/产品相关信息)表
  2. 将购物车信息插入 order_header 以生成 order_id
  3. order_headerselect order_id from order_header where user = {$user_id} and status = 'new' 获取order_id
  4. 使用insert intoorder_detail(order_id,some columns here...) select ('{$order_id}',some columns here...) from carts where user = {$user_id};将项目/产品详细信息插入order_detail
  5. 然后将 cart_status 更新为 'ordered' - 就是这样!

【讨论】:

    【解决方案3】:

    已将 orderID 设置为主键。不能重复

    【讨论】:

      猜你喜欢
      • 2011-12-04
      • 1970-01-01
      • 2015-02-21
      • 2014-09-06
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多