【问题标题】:PDO get the last ID insertedPDO 获取最后插入的 ID
【发布时间】:2012-05-27 16:46:57
【问题描述】:

我有一个查询,我想获取最后插入的 ID。字段ID为主键,自增。

我知道我必须使用这个语句:

LAST_INSERT_ID()

该语句适用于这样的查询:

$query = "INSERT INTO `cell-place` (ID) VALUES (LAST_INSERT_ID())";

但是如果我想使用这个语句获取 ID:

$ID = LAST_INSERT_ID();

我收到此错误:

Fatal error: Call to undefined function LAST_INSERT_ID()

我做错了什么?

【问题讨论】:

    标签: php mysql database pdo


    【解决方案1】:

    那是因为那是一个 SQL 函数,而不是 PHP。你可以使用PDO::lastInsertId()

    喜欢:

    $stmt = $db->prepare("...");
    $stmt->execute();
    $id = $db->lastInsertId();
    

    如果你想用 SQL 而不是 PDO API 来做,你可以像普通的选择查询一样做:

    $stmt = $db->query("SELECT LAST_INSERT_ID()");
    $lastId = $stmt->fetchColumn();
    

    【讨论】:

    • 是的,你说得对,我找到了它并且它有效,谢谢,我会接受答案
    • @rybo111,首先是Screaming snake case。其次,它是 MySQL 命名约定,而不是 PHP
    • @rybo111,嗯SELECT LAST_INSERT_ID()是一个MySQL函数
    • 所以也许这是一个愚蠢的后续问题,但我只想确定。当我依赖 lastInsertId() 时,它是否返回我当前正在执行的代码中发生的最后插入的 ID?或者它是否从我的数据库中返回最后插入的 ID?例如,如果我有一个访问量很大的网站,并且我在登录脚本期间插入了一些内容并使用 lastInsertId() 来获取插入的 ID,但是很多人同时登录,那么依靠 lastInsertId( ) 从执行的特定代码实例中获取最后插入的 ID?还是我冒风险
    • @ArtGeigel 这将是 PDO 实例底层连接的最后插入 ID。换句话说,在您描述的场景中它是安全的,因为并发查询将在单独的连接中进行。
    【解决方案2】:

    lastInsertId() 仅在 INSERT 查询之后起作用。

    正确:

    $stmt = $this->conn->prepare("INSERT INTO users(userName,userEmail,userPass) 
                                  VALUES(?,?,?);");
    $sonuc = $stmt->execute([$username,$email,$pass]);
    $LAST_ID = $this->conn->lastInsertId();
    

    不正确:

    $stmt = $this->conn->prepare("SELECT * FROM users");
    $sonuc = $stmt->execute();
    $LAST_ID = $this->conn->lastInsertId(); //always return string(1)=0
    

    【讨论】:

      【解决方案3】:

      您可以通过在连接对象($conn)上运行 lastInsertId() 方法来获取最后一个事务的 id。

      像这样 $lid = $conn->lastInsertId();

      请查看文档https://www.php.net/manual/en/language.oop5.basic.php

      【讨论】:

      • 欢迎来到 Stack Overflow。我们重视有用的贡献,但请不要重复现有的答案。
      猜你喜欢
      • 2014-09-10
      • 1970-01-01
      • 2012-05-31
      • 2011-06-30
      • 1970-01-01
      • 2013-05-26
      相关资源
      最近更新 更多