[英]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.