这很奇怪。我只用一个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调用中运行每个查询。这是打算起作用的应用程序编程接口的方式。
它不仅可以防止出现这种情况,还可以使您的代码更具可读性和可维护性。
这也将使您的代码更加安全。您只能在一次调用中运行多个语句,而以本机准备的语句为代价。无论这个漏洞有多虚拟,为什么还要冒险?
为什么不进行常规的SELECT查询而不是SET,将结果值放入PHP变量,然后仅通过占位符在其他变量中使用它?我看不出有什么理由应该采用这种复杂的方式来处理简单数据。
如果我无法说服您,原因很简单。您正在运行two查询,并且第一个查询不会触发任何插入ID。显然,您需要此查询的元数据(错误,受影响的行等),而不是另一个查询的元数据。所以你明白了。为了获得第二个查询的元数据,您必须向数据库查询。我的文章Treating PDO delusions - The only proper PDO tutorial: Running multiple queries with PDO中对此过程进行了解释。基本上,PDOStatement::nextRowset()
是您需要的。