gpt4 book ai didi

php - PDO lastInsertID() 由于在一次调用中运行多个查询而失败

转载 作者:行者123 更新时间:2023-11-29 06:28:20 27 4
gpt4 key购买 nike

这很奇怪。我正在运行一个仅包含单个 INSERT 的查询,前面有一个 SET 语句。查询看起来像这样:

SET @discount:=(SELECT discount * :applyDiscount FROM fra_cus WHERE customerID=:customerID AND franchiseID=:franchiseID);

INSERT INTO discounts_applied (unitID, franchiseID, customerID, amount)
VALUES(:unitID, :franchiseID, :customerID, @discount * :price);

看来,如果我将它们准备为两个单独的 PDO 查询,lastInsertID() 工作正常...但如果我准备它们并在同一个语句中执行它们,lastInsertID() 不会返回任何内容。

这不是世界末日,但很烦人。有谁知道为什么会出现这种情况?作为记录,我需要将 @discount 定义为变量(与其中一个表上的触发器有关)。而且这一切都发生在一个更大的事务中。

最佳答案

首先,我强烈建议在不同的 API 调用中运行每个查询。这就是应用程序编程接口(interface)预期的工作方式。

它不仅可以防止类似的情况发生,而且还可以使您的代码更具可读性和可维护性。

它也会使您的代码更加安全。您可以在一次调用中运行多个语句,但需要牺牲 native 准备好的语句。无论这个漏洞多么虚拟,为什么还要冒险呢?

为什么不进行常规 SELECT 查询而不是 SET,将结果值放入 PHP 变量中,然后仅通过占位符在其他变量中使用它?我不明白为什么应该有如此复杂的方法来处理简单的数据。

如果我没能说服你,原因很简单。您正在运行两个查询,第一个查询不会触发任何插入 ID。显然,您需要此查询的元数据(错误、受影响的行等),而不是另一个查询的元数据。所以你明白了。要获取第二个查询的元数据,您必须向数据库询问。我的文章中解释了该过程:Treating PHP delusions - The only proper PDO tutorial: Running multiple queries with PDO 。基本上 PDOStatement::nextRowset() 就是您所需要的。

关于php - PDO lastInsertID() 由于在一次调用中运行多个查询而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58160001/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com