【问题标题】:Using $this->db->insert_id() with multiple users on Codeigniter在 Codeigniter 上与多个用户一起使用 $this->db->insert_id()
【发布时间】:2014-05-07 16:01:00
【问题描述】:

我正在使用 Codeigniter 构建一个电子商务网站,允许用户注册、购买产品并跟踪订单。

我在网站周围的几个地方使用以下内容,主要是在用户提交订单时:

$this->db->insert_id();

基本上,当用户提交订单时,它会将订单添加到一个表中,然后,在同一段代码中(紧接插入查询之后),使用创建时创建的 ID 将每个订单项添加到另一个表中订单被插入到第一个表中。

我的问题是:在以下内容中,$this->db->insert_id(); 是什么?做:

1) 它是否获得刚刚插入(并且仅来自)插入查询的 ID 才运行? 2) 不管它来自什么查询,它是否从数据库中的最新条目中获取最后插入的 ID?

基本上我是想避免订单混淆,例如,如果多个客户同时提交订单,我不希望将一个客户的订单商品添加到错误的订单中。

我认为答案是 1,没有问题,但我想确定一下。

谢谢!

【问题讨论】:

  • 我不是 CodeIgniter 用户,但我 100% 确信它可以按预期工作。它只能是底层 PHP 扩展中等效函数的包装器。

标签: php mysql codeigniter


【解决方案1】:

它获取最后一个查询最后插入的 ID。所以你在#1中所说的

【讨论】:

    【解决方案2】:

    只是一个建议 - 但另一种方法是生成一个随机字符串 - 并使用它将购物车项目和订单关联在一起 - 而不是通过订单 ID。您仍将使用订单 ID 作为“订单号”。

    这使您可以选择在购物会话首次开始时生成该随机字符串,并在购买过程中使用它将购物车物品、运输、计费等联系在一起。因此,您可以立即开始订购,但在交易验证之前,您不必在最终订单表中提交空间。

    【讨论】:

      【解决方案3】:

      您的问题暴露了 codeigniter 环境中的一个潜在错误。如果连续快速完成两次插入,您如何确信从 insert_id 返回的 ID 是正确的 ID?

      Codeigniter 文档没有回答这个问题

      http://ellislab.com/codeigniter/user-guide/database/helpers.html

      来自 ellis lab 的相关博客文章并未解决该问题。它得出的结论是,适当的解决方案是抓住机会。

      http://ellislab.com/forums/viewthread/63052/

      如果此函数是 mysqli_insert_id 的包装函数,则 php.net 上的文档未说明。

      http://www.php.net/manual/en/mysqli.insert-id.php

      它表明 ID 来自“最后一个查询”。它没有说明谁的最后一个查询。

      连续两次插入,返回错误的 ID 将危及数据的完整性。确定的方法是锁定数据库。

      $this->db->query('LOCK TABLE (your table name) WRITE');
      $this->db->insert('(your table name');
      $int_id = $this->db->insert_id();
      $this->db->query('UNLOCK TABLES');
      

      这对执行时间有负面影响,但取决于您的服务器容量可能比数据损坏更可取。

      【讨论】:

      猜你喜欢
      • 2011-10-20
      • 2013-05-31
      • 2016-12-29
      • 1970-01-01
      • 2015-12-15
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 2013-07-08
      相关资源
      最近更新 更多