PDO + PHP lastInsertId()问题

时间:2012-07-10 11:04:20

标签: php mysql database pdo lastinsertid

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

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

P.S自动生成id。

谢谢。

3 个答案:

答案 0 :(得分:5)

manual中所述:

  

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

mysql>SELECT LAST_INSERT_ID();
    ->195
     

当前正在执行的语句不会影响其值   LAST_INSERT_ID()。假设您生成AUTO_INCREMENT值   用一个语句,然后在a中引用LAST_INSERT_ID()   多行INSERT语句,用于将行插入表中   拥有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()始终是事务安全的(即使您不使用事务)。

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

要抵消这种情况,您可以使用transaction

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