【发布时间】:2018-06-23 03:55:38
【问题描述】:
我有一个非常简单的查询,不知道我在这里做错了什么。
我的数据库调用没有收到我期望的insert id。
表格:
存储过程:
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;
END
PHP:
public function addProduct($data, $userID)
{
// Do we already have a pending order for this user?
$orderID = $this->doesOrderExist($userID);
// We had no order, lets create one
if (!$orderID) {
$orderID = $this->createOrder($userID);
}
/**
* Insert the customer product.
* This relates a denomination to a customer.
*/
$customerProductID = $this->addCustomerProduct($data);
// Add this customer product to the order
$this->addProductToOrder(array("customerProductID" => $customerProductID, "orderID" => $orderID));
// Return
return $customerProductID;
}
/**
* Description: Add a customer product / reward
* Page: client/add_reward
*/
public function addCustomerProduct($data){
$procedure = "CALL addCustomerProduct(?,?)";
$result = $this->db->query($procedure, $data);
return $this->db->insert_id();
}
问题所在的行是:$customerProductID = $this->addCustomerProduct($data);。
正在向表中插入一条新记录,并且该表具有PK/AI。数据正常,但 0 返回为 $customerProductID。
从 select 语句中插入可能不会返回 insert ID 吗?
更新@Ravi-
更新 2:
我创建了一个单独的方法并对正在发送的查询和数据进行硬编码。
添加记录正常,AI 上升,0 返回为last id。
public function test(){
$procedure = "CALL addCustomerProduct(?,?)";
$result = $this->db->query($procedure, array("customerID" => 1, "productID" => 20));
echo $this->db->insert_id();
}
还重新启动了 MySQL 服务器以确保那里没有发生任何异常情况。
另外,更新了 SP 以在不使用选择的情况下将随机数据插入表中。
CREATE DEFINER=`root`@`localhost` PROCEDURE `addCustomerProduct`(IN in_customerID INT, in_productID INT)
BEGIN
INSERT INTO order_customer_product (customerID, productID, retailAmountAtPurchase, faceValue)
VALUES(8,2,'4.55',25);
END
更新 3:
在插入之后,我将打印出运行的最后一个查询以及结果。您会注意到有 1 个受影响的行(正在插入)但 insert_id 仍然为 0。
CALL addCustomerProduct('8','33')
CI_DB_mysqli_result Object
(
[conn_id] => mysqli Object
(
[affected_rows] => 1
[client_info] => mysqlnd 5.0.12-dev - 20150407 - $Id: b396954eeb2d1d9ed7902b8bae237b287f21ad9e $
[client_version] => 50012
[connect_errno] => 0
[connect_error] =>
[errno] => 0
[error] =>
[error_list] => Array
(
)
[field_count] => 0
[host_info] => Localhost via UNIX socket
[info] =>
[insert_id] => 0
[server_info] => 5.6.35
[server_version] => 50635
[stat] => Uptime: 1637 Threads: 3 Questions: 508 Slow queries: 0 Opens: 113 Flush tables: 1 Open tables: 106 Queries per second avg: 0.310
[sqlstate] => 00000
[protocol_version] => 10
[thread_id] => 25
[warning_count] => 0
)
[result_id] => 1
[result_array] => Array
(
)
[result_object] => Array
(
)
[custom_result_object] => Array
(
)
[current_row] => 0
[num_rows] =>
[row_data] =>
)
更新 4:
从我做的一些研究来看,除非你使用$this->db->insert()之类的mysqli方法,否则它不会向你提供最后一个插入id。
我将尝试找出 Ravi 的建议,但似乎代码点火器不允许显示的示例。至少我现在知道,除非您使用“insert”方法而不是存储过程,否则我并没有发疯,它只是不正常的行为。
【问题讨论】:
-
您期望的插入 ID 是什么?
-
@Ravi - 从
addCustomerProduct()过程创建的AI,位于页面顶部。 -
不应该是
$this->db->insert_id;而不是$this->db->insert_id(); -
@RamRaider - 不要相信,这是一个框架(CodeIgniter),这是一个内置的方法。在我的代码中的其他任何地方都可以使用:.
-
打开“通用日志”以查看确切发出的命令。它不会包含
insert_id(),但它可能包含 Codeigniter 正在插入的一些语句。
标签: php mysql codeigniter