我正在使用Codeigniter构建电子商务网站,该网站允许用户注册,购买产品然后跟踪订单。
我在网站的几个地方使用以下内容,主要是在用户提交订单时:
$this->db->insert_id();
基本上当用户提交订单时,它会将订单添加到一个表中,然后,在同一段代码中(紧接在插入查询之后),使用在创建时创建的ID将每个订单项添加到另一个表中。订单被插入第一个表格。
我的问题是:出于以下情况,$ this-> db-> insert_id();做:
1)它是否获得刚刚插入的ID(并且仅来自)插入查询刚刚运行? 2)它是否从数据库中的最新条目获取最后插入的ID,无论它来自哪个查询?
基本上我试图避免订单混淆,例如,如果有几个客户同时提交订单,我不希望将一个客户的订单商品添加到订单不正确。
我认为答案是1,并且没有问题,但我想确定。
谢谢!
答案 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');
这会对执行时间产生负面影响,但根据服务器的容量,可能会比数据损坏更可取。