Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用$this->;db->;在Codeigniter上插入多个用户的_id()_Php_Mysql_Codeigniter - Fatal编程技术网

Php 使用$this->;db->;在Codeigniter上插入多个用户的_id()

Php 使用$this->;db->;在Codeigniter上插入多个用户的_id(),php,mysql,codeigniter,Php,Mysql,Codeigniter,我正在用Codeigniter建立一个电子商务网站,它允许用户注册、购买产品,然后跟踪订单 我在网站的几个地方使用了以下内容,主要是当用户提交订单时: $this->db->insert_id(); 基本上,当用户提交订单时,它会将订单添加到一个表中,然后在相同的代码段内(插入查询之后),使用订单插入第一个表时创建的ID将每个订单项添加到另一个表中 我的问题是:$this->db->insert_id()是什么;做: 1) 它是否获取刚刚插入(且仅来自)的ID?insert查询刚刚

我正在用Codeigniter建立一个电子商务网站,它允许用户注册、购买产品,然后跟踪订单

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

$this->db->insert_id();
基本上,当用户提交订单时,它会将订单添加到一个表中,然后在相同的代码段内(插入查询之后),使用订单插入第一个表时创建的ID将每个订单项添加到另一个表中

我的问题是:$this->db->insert_id()是什么;做:

1) 它是否获取刚刚插入(且仅来自)的ID?insert查询刚刚运行? 2) 它是否从数据库中的最新条目中获取最后插入的ID,而不管其查询来自何处

基本上,我试图避免订单混淆,例如,如果多个客户同时提交订单,我不希望一个客户的订单项目添加到错误的订单中

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


谢谢

它获取上次查询最后插入的ID。因此,您在#1

中所说的只是一个建议—但另一种方法是生成一个随机字符串—并使用该字符串将购物车项目和订单关联在一起—而不是按订单id。您仍然可以使用订单id作为“订单号”


这使您可以选择在购物会话首次开始时生成该随机字符串,并在购物过程中使用该字符串将购物车项目、装运、账单等绑定在一起。因此,您可以立即启动订单,但在事务验证之前,您不必在最终订单表中提交空格

您的问题暴露了codeigniter环境中的潜在缺陷。如果两次插入都是快速连续完成的,您如何确信从insert_ID返回的ID是正确的ID

Codeigniter文档没有回答这个问题

ellis实验室的相关博客文章并不能解决这个问题。它的结论是,适当的解决办法是抓住机会

如果此函数是mysqli_insert_id的包装函数,则php.net上的文档是未加密的

它声明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');

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

我不是CodeIgniter用户,但我100%确信它能按预期工作。它只能是底层PHP扩展中等效函数的包装器。插入ID将来自当前执行页面的DB会话。不需要锁定表。看见