繁体   English   中英

PDO + PHP lastInsertId()问题

[英]PDO + PHP lastInsertId() issue

如果例如当用户点击链接,自动插入新行然后php代码请求最后插入的id,同时另一个用户插入另一行时,它不会有问题吗?所以返回的id实际上不是我期待的那个..?

我错了吗? 没有“安全”漏洞,有没有办法做同样的事情?
(可能来自准备好的声明或其他内容......)

PS自动生成id。

谢谢。

手册中所述:

LAST_INSERT_ID() (不带参数)返回一个BIGINT (64位)值,表示由最近执行的 INSERT语句为AUTO_INCREMENT列设置的第一个自动生成的值,以影响此类列。 例如,在插入生成AUTO_INCREMENT值的行后,您可以获得如下值:

 mysql>SELECT LAST_INSERT_ID(); ->195 

当前正在执行的语句不会影响LAST_INSERT_ID()的值。 假设您使用一个语句生成AUTO_INCREMENT值,然后在多行INSERT语句中引用LAST_INSERT_ID() ,该语句将行插入到具有自己的AUTO_INCREMENT列的表中。 LAST_INSERT_ID()的值将在第二个语句中保持稳定; 它的第二行和后一行的值不受先前行插入的影响。 (但是,如果混合对LAST_INSERT_ID()LAST_INSERT_ID(expr)引用,则效果未定义。)

如果前一个语句返回错误,则LAST_INSERT_ID()值未定义。 对于事务表,如果由于错误而回滚语句,则LAST_INSERT_ID()的值未定义。 对于手动ROLLBACK, LAST_INSERT_ID()值不会恢复到事务之前的值; 它仍然像ROLLBACK那样

因此, LAST_INSERT_ID()始终是事务安全的(即使您不使用事务)。

成功INSERT后,MySQL Server将插入ID作为OK消息的一部分进行传输。 此ID存储在PDO中,因此无需往返服务器PDO可以安全地为您的连接返回正确的ID。

参考: http//forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol#OK_Packet

要抵消这种情况,您将使用交易

这实际上会将您的插入与其他插入隔离,因此只要您的Insert / lastInsertId()调用在同一个事务中,它就可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM