【问题标题】:Nesting LAST_INSERT_ID() in a PDO prepared statement?在 PDO 准备好的语句中嵌套 LAST_INSERT_ID()?
【发布时间】:2020-08-13 23:50:03
【问题描述】:

将 PHP 与 MySQL 和 PDO 准备语句一起使用,我想以一种简单、安全和高效的方式来模拟一个不透明的 id。这个想法是为 LAST_INSERT_ID 的当前值添加一个随机值。

INSERT INTO table 
SET id = LAST_INSERT_ID( LAST_INSERT_ID() + FLOOR(1 + (RAND() * 99)) ), 
text = ?,
...

外部表达式设置id,内部调用获取当前值并修改它。当我使用 Sequel Pro 客户端对其进行测试时,这可以按预期工作。但是,在带有准备好的语句的实际脚本中,最后一个插入 ID 不会被更新/保存。所以,我确实得到了随机 id,但它们没有加起来。

我错过了什么?

【问题讨论】:

  • 定义我无法正常工作
  • 您缺少的是说明实际问题是什么,即什么不起作用。我还假设数据库是某种风格的 MySql(你没有说)——它是我知道的唯一一个有 LAST_INSERT_ID 的数据库。我的理解是,通过将表达式值设置为对LAST_INSERT_ID 的调用,您稍后将能够在没有参数的情况下再次调用LAST_INSERT_ID 并检索表达式。从您发布的内容中不清楚它的价值。
  • 第一次插入时LAST_INSERT_ID() 是什么?
  • 谢谢,我补充了。你可以说,LAST_INSERT_ID() 总是返回 0。但请注意,我不需要获取该值,它主要是为了在 dbms 内部工作。
  • 问题是 LAST_INSERT_ID 只是 客户端执行的最后一条语句的最后插入 ID。所以它不是数据库中的最后一个值。

标签: php pdo nested prepared-statement last-insert-id


【解决方案1】:

这确实行不通,原因如下:

  • LAST_INSERT_ID() 在每个连接的第一次调用时返回 0,因为没有最后插入。不幸的是,它只是返回潜在的下一个 AUTO_INCREMENT 值。
  • 如果您将其拆分为单独的命令,在同一语句中先插入,然后再更新,则 LAST_INSERT_ID() 不会在两者之间更新。
  • 此外,“如果混合对 LAST_INSERT_ID() 和 LAST_INSERT_ID(expr) 的引用,效果未定义”ManualManual
  • LAST_INSERT_ID() 将忽略更新后的 ID

【讨论】:

  • 看起来你在严重滥用这个功能。
  • 可能是我的一句话写得不好。但是,我认为投票没有任何意义,更不用说对此的解释了。吸取的这一教训可能会使其他人免于陷入同样的​​死胡同。如果事情确实以某种方式起作用,那么更加努力可能是值得的。感谢@nigel 的正确提示/冲动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 2011-07-13
相关资源
最近更新 更多