在Codeigniter上使用带有多个用户的$ this-> db-> insert_id()

时间:2014-05-07 16:01:00

标签: php mysql codeigniter

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

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

$this->db->insert_id();

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

我的问题是:出于以下情况,$ this-> db-> insert_id();做:

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

基本上我试图避免订单混淆,例如,如果有几个客户同时提交订单,我不希望将一个客户的订单商品添加到订单不正确。

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

谢谢!

3 个答案:

答案 0 :(得分:2)

它获取上次查询最后插入的ID。那么你在#1

中所说的话

答案 1 :(得分:0)

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

这使您可以选择在购物会话首次开始时生成该随机字符串,并在购买正在进行时使用它将购物车项目,运费,结算等联系起来。因此,您可以立即启动订单,但在事务验证之前,您不必在最终订单表中提交空格。

答案 2 :(得分:0)

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

Codeigniter文档没有回答这个问题

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

ellis实验室的相关博客文章无法解决问题。它的结论是,适当的解决方案是抓住机会。

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');

这会对执行时间产生负面影响,但根据服务器的容量,可能会比数据损坏更可取。