【问题标题】:PDO Last Insert ID always the right one?PDO Last Insert ID 总是正确的?
【发布时间】:2012-04-11 03:02:07
【问题描述】:

我有以下代码:

<?
$query =$db->prepare("INSERT INTO a_table (id, a_field) VALUES ('', (:a_field)");
$query->bindParam(":a_field", $a_value);
$query->execute();
$last_id = $db->lastInsertId('a_table');
?>

我想问的是这个。想象一下,当两个人同时加载页面时,是否有可能在检索到最后一个 ID 之前插入其他人的查询,从而混淆 ID?

【问题讨论】:

  • 不,不会有冲突。插入id依赖于连接,每次页面加载都会建立一个新的连接。
  • 取决于底层数据库。如果是 mysql,PDO 将简单地调用 mysql last_insert_id() API 函数,它保证返回的 ID 是您的 PDO 连接执行的最后一个插入查询生成的 ID。
  • 这是mysql,所以我知道我很安全。非常感谢!迈克尔,抱歉,没有找到您所指的帖子...

标签: php pdo


【解决方案1】:

不,这种情况是不可能的。 方法 $db->lastInsertId() 返回此 DB 连接的最后插入 id。在其他页面中将是另一个连接和另一个最后插入的 id。

【讨论】:

    【解决方案2】:

    PDO 将返回当前活动数据库连接插入的最后一个 ID。

    【讨论】:

      【解决方案3】:

      刚遇到以下情况

      拥有文件post.php,其中包含另一个文件(如insert.php)。

      要插入mysql的整个代码位于insert.php

      insert.php 中是代码$id_of_inserted_row = $db-&gt;lastInsertId();

      那么insert.php 中的echo $id_of_inserted_row; 显示正确的值。

      但是post.php 中的echo $id_of_inserted_row; 显示不正确的值(我看到显示比实际值少7 个数字)。我不明白为什么,只是需要考虑一下。

      更新

      对不起,上面写的是因为插入到两个表中并错误地为两个表使用了相同的$id_of_inserted_row = $db-&gt;lastInsertId();

      所以我有与其他答案相同的结论:lastInsertId() 获取最后插入行的 id。

      面临的情况。我在mysql中插入了2行。在这种情况下,我看到 lastInsertId() 是第一个插入行的 id(不是最后一行)。不明白为什么... 找到答案https://stackoverflow.com/a/12574752/2118559

      重要如果您使用单个 INSERT 语句插入多行,LAST_INSERT_ID() 仅返回为第一个插入行生成的值。这样做的原因是可以轻松地针对其他服务器重现相同的 INSERT 语句。

      【讨论】:

        猜你喜欢
        • 2021-11-24
        • 1970-01-01
        • 2019-06-22
        • 1970-01-01
        • 2013-09-10
        • 1970-01-01
        • 1970-01-01
        • 2020-11-20
        • 1970-01-01
        相关资源
        最近更新 更多