如果mysql_insert_id同时调用不同的地方和不同的浏览器会发生什么?

时间:2012-09-17 21:06:33

标签: php mysql-insert-id

也许我有一些关于mysql_insert_id的愚蠢问题......

我需要在mysql_query(“INSERT INTO”)之后使用mysql_insert_id获取查询的最后一个插入ID。

mysql_insert_id通过上一个查询检索生成的Id,但我的问题是......

一个名为test.php的php文件,代码如下

mysql_query("INSERT INTO table (FirstName, LastName) VALUES ('" . $_POST['FirstName'] . "', '" . $_POST['LastName'] . "'); ")
$lastId = mysql_insert_id();
...continues some code using $lastId

如果test.php文件在同一时间从不同的地方和不同的浏览器调用会怎样? 或者如果同时调用INSERT INTO查询的其他php文件会发生什么?

实际上Id获取了mysql_insert_id()的内容? 我们有一个罕见的概率?

我不知道我是否可以理解......

3 个答案:

答案 0 :(得分:4)

PHP manual声明mysql_insert_id()的值仅返回最近生成的AUTO_INCREMENT值:

  

MySQL SQL函数LAST_INSERT_ID()的值始终包含最近生成的AUTO_INCREMENT值,并且不会在查询之间重置。

MySQL manual声明它会根据每个连接返回最后一个AUTO_INCREMENT

  

生成的ID在每个连接的服务器中维护。这意味着函数返回给定客户端的值是为该客户端影响AUTO_INCREMENT的最新语句生成的第一个AUTO_INCREMENT值。此值不受其他客户端的影响,即使它们生成自己的AUTO_INCREMENT值。此行为可确保每个客户端都可以检索自己的ID,而无需关心其他客户端的活动,也无需锁定或事务。

此外,您应该停止使用mysql_ deprecated的{{1}}功能。

答案 1 :(得分:2)

每个客户都将坐在单独的连接上。 mysql_insert_id()将根据传递的/当前连接获取最后id个查询的insert。因此,您不必担心多个脚本会导致问题。

此外,从您上面提供的代码中,您的脚本容易受到SQL注入攻击。逃避用户输入甚至更好,使用PDO / MySQLi。

答案 2 :(得分:1)

您从连接的最后一个查询中获取自动增量ID。它不会交叉连接,因此同时运行的两个脚本没有任何危害。

附注:如果您有选项,请使用mysqli或PDO库而不是不推荐使用的mysql库。