lastInsertId()

1. 定义

顾名思义,该方法返回最后一次插入行的 ID 或序列值。

注:

  • 返回的是最后插入行的 ID 还是一个序列对象最后的值,取决于数据库驱动
  • 不同数据库 PDO 驱动可能不会返回一个一致的结果,因为某些数据库可能不支持自增字段或序列

2. 语法

PDO::lastInsertId ([ string $name = NULL ] ) : string

3. 参数说明

参数 可选性 数据类型 描述
$name 可选 字符串 默认为NULL,某些数据库 PDO 驱动返回一个序列对象时要求指定序列对象的名称

其中,根据$name参数的不同,有以下三种情况:

  • $name不被指定:即不传入任何参数,该方法将返回最后插入行 ID 值的字符串表示
  • 指定$name:返回指定序列对象的最后一个值的字符串表示
  • 当前 PDO 驱动不支持该方法:触发IM001 SQLSTATE错误

另外,当在事务中一次性插入多条记录后,提交事务前执行该方法可以获得正确的结果,但如果在提交事务后执行将返回 0 。

4. 示例

<?php

// PDO::lastInsertId()
// 返回最后一次插入行的 ID 或序列值

try {
    $config = ['driver' => 'mysql', 'host' => 'localhost', 'dbname' => 'test', 'charset' => 'utf8', 'user' => 'root', 'pwd' => 'mysql'];
    $dsn = sprintf('%s:host=%s;dbname=%s;charset=%s', $config['driver'], $config['host'], $config['dbname'], $config['charset']);
    $conn = new PDO($dsn, $config['user'], $config['pwd']);

    $statement = "INSERT INTO `movie`(`name`, `rate`, `url`, `cover`, `cover_x`, `cover_y`) VALUES ('哪吒之魔童降世', 8.5, 'https://movie.douban.com/subject/26794435/', 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2563780504.jpg', 5594, 8268)";
    $count = $conn->exec($statement);
    $lastid = $conn->lastInsertId();
    echo '刚才插入了 ',$count,' 条数据,最后一次插入数据的 ID 为 ',$lastid,"\n";// 输出:刚才插入了 1 条数据,最后一次插入数据的 ID 为 22

    // 指定插入ID为 33:正确执行
    $statement = "INSERT INTO `movie`(`id`, `name`, `rate`, `url`, `cover`, `cover_x`, `cover_y`) VALUES (33, '哪吒之魔童降世', 8.5, 'https://movie.douban.com/subject/26794435/', 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2563780504.jpg', 5594, 8268)";
    $count = $conn->exec($statement);
    $lastid = $conn->lastInsertId();
    echo '刚才插入了 ',$count,' 条数据,最后一次插入数据的 ID 为 ',$lastid,"\n";// 输出:刚才插入了 1 条数据,最后一次插入数据的 ID 为 33
} catch (PDOException $e) {
    error_log($e->getMessage()); // 将错误信息记录至日志
    echo $e->getMessage();
}