如果例如当用户点击链接时,自动插入新行然后php代码请求最后插入的id,同时插入另一行,则不会出现问题吗?另一个用户,所以返回的id实际上不是我期待的那个..?
我错了吗?没有“安全”漏洞,有没有办法做同样的事情? (可能来自准备好的陈述或其他内容......)
P.S自动生成id。
谢谢。
答案 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()
调用位于同一个事务中,它就可以正常工作。