Php 在PDO准备的语句中嵌套最后一个_INSERT_ID()?
使用PHP和MySQL和PDO准备的语句,我希望以一种简单、安全和高效的方式模拟不透明id。其思想是将一个随机值添加到LAST_INSERT_ID的当前值中Php 在PDO准备的语句中嵌套最后一个_INSERT_ID()?,php,pdo,nested,prepared-statement,last-insert-id,Php,Pdo,Nested,Prepared Statement,Last Insert Id,使用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客户端测试它时,它就如预期的那样工作了。但是,在
INSERT INTO table
SET id = LAST_INSERT_ID( LAST_INSERT_ID() + FLOOR(1 + (RAND() * 99)) ),
text = ?,
...
外部表达式设置id,内部调用获取当前值并对其进行修改。当我用Sequel Pro客户端测试它时,它就如预期的那样工作了。但是,在具有准备好的语句的真实脚本中,不会更新/保存最后一个插入id。所以,我确实得到了随机ID,但它们并没有相加
我遗漏了什么?这确实不起作用,原因如下:
- LAST_INSERT_ID()在每个连接的第一次调用时返回0,因为没有最后一次插入。不幸的是,它不返回下一个自动增量值
- 如果将其拆分为单独的命令,首先在同一语句中插入,然后在同一语句中更新,那么最后一个\u INSERT\u ID()将不会在其间更新
- 此外,“如果混合引用LAST_INSERT_ID()和LAST_INSERT_ID(expr),效果是未定义的”vs
- 更新的ID将被上次插入的ID()忽略
LAST\u INSERT\u ID
的数据库。我的理解是,通过将表达式值设置为对LAST\u INSERT\u ID
的调用,您稍后将能够无参数再次调用LAST\u INSERT\u ID
,并检索表达式。从你发布的内容中还不清楚它的值。你第一次插入时,最后一次插入\u ID()
是什么?谢谢,我补充了这个。您可以说,LAST\u INSERT\u ID()
始终返回0。但请注意,我不需要获取该值,它主要是在dbms内部工作。问题是LAST_INSERT_ID只是客户端执行的最后一条语句的最后一个插入ID。因此,它不是数据库中的最后一个值。看起来您严重滥用了此函数。可能是我的一句话写得不好。然而,我不认为投反对票有任何意义,更不用说解释了。这一教训可能会让其他人避免走同一条死胡同。如果事情确实在某种程度上起作用,那就值得更加努力。感谢@nigel的正确提示/冲动。