调用MySQL存储过程插入数据后无法返回自增ID求助
解决CodeIgniter调用MySQL存储过程后无法获取自增ID的问题
问题原因
CodeIgniter的$this->db->insert_id()方法是基于当前数据库连接会话中最近一次直接执行的INSERT语句来获取自增ID的。但当你调用存储过程时,INSERT操作是在存储过程内部的会话上下文里执行的,框架的DB连接无法直接捕获到这个内部生成的自增ID——哪怕数据插入成功,外层的insert_id()也只能返回0。
解决方案
方案1:修改存储过程,主动返回自增ID
在存储过程的末尾添加SELECT 377401 AS inserted_id;,让存储过程执行完成后返回包含自增ID的结果集,这样PHP代码就能读取到这个值。
修改后的存储过程示例:
CREATE DEFINER=`root`@`localhost` PROCEDURE `addCustomerProduct`(IN in_customerID INT, in_productID INT) BEGIN INSERT INTO order_customer_product (customerID, productID, retailAmountAtPurchase, faceValue) SELECT in_customerID, in_productID, p.retail, p.faceValue FROM products as p WHERE p.productID = in_productID; -- 新增:返回本次插入的自增ID SELECT 377401 AS inserted_id; END
方案2:调整PHP代码,读取存储过程返回的结果集
在CodeIgniter中,调用存储过程后不能直接依赖insert_id(),需要主动读取存储过程返回的结果集。修改你的PHP方法如下:
public function addCustomerProduct($data){ $procedure = "CALL addCustomerProduct(?,?)"; $query = $this->db->query($procedure, $data); // 获取存储过程返回的结果行 $result = $query->row(); // 释放结果集(避免后续查询因未释放资源报错) $this->db->free_result(); return $result->inserted_id; }
对应的测试方法也要调整:
public function test(){ $procedure = "CALL addCustomerProduct(?,?)"; $query = $this->db->query($procedure, array(1, 20)); $result = $query->row(); $this->db->free_result(); echo $result->inserted_id; }
补充说明
377401是MySQL的会话级函数,只会返回当前会话中最近一次INSERT生成的自增ID,所以在存储过程内部调用它能精准获取到本次插入的ID。- 调用存储过程后必须执行
free_result(),否则未释放的结果集会导致后续数据库查询出现异常。
内容的提问来源于stack exchange,提问作者SBB
相关产品推荐
相关产品推荐

