【PHP】PDOのINSERT文で挿入されたIDを取得するlastInsertIdの使い方

PHPのPDOオブジェクトには、最後のINSERTで挿入された行の連番IDを取得する機能があります。

参考 PDOでINSERTの使い方【PHP】

今回はそんなlastInsertIdメソッドの使い方についてまとめました。

lastInsertIdの使い方

lastInsertIdは、PDOオブジェクトに備わっている関数です。

INSERT文の後に、自動的に割り振られたIDの番号を取得できます。

$sql = "INSERT INTO sample_table('name') VALUES('test')";
$pdo -> query($sql);

//INSERT後にPDOオブジェクトからIDを取得できる
$id = $pdo -> lastInsertId();

ただし、これが使用できる条件として、

挿入したテーブルの主キーがAUTO INCREMENT(オートインクリメント)の自動連番である必要があります。

主な使い方として、掲示板などの投稿ページで、投稿した内容の専用ページにIDクエリを付けて遷移させる、などの運用が考えられます。

lastInsertIdで取得できない場合の確認事項

lastInsertId()メソッドでIDを取得できないケースについてまとめました。

prepare用オブジェクトを参照してしまっている(記述ミス)

lastInsertIdは、データベースへの接続を担う大元のPDOデータベースオブジェクトで使用できます。

勘違いしやすい要素として、prepareメソッドやqueryメソッドで、PDOステートメントオブジェクトを作った場合、そちらのオブジェクトでlastInsertIdを実行してしまうことがあります。

try{
    $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '1234');
}catch(PDOException $e){
    exit('CONNECT ERROR '.$e->getMessage());
}

$sql = "INSERT INTO sample_table('name') VALUES(:name)";
$sth = $pdo -> prepare($sql);
$sth -> bindValue(':name', 'Tanaka');
$sth -> execute();
//$id = $sth -> lastInsertId(); //←$sthではlastInsertIdは使用できない
$id = $pdo -> lastInsertId();   //←こちらが正解

もっとも、このミスが起きた場合は、

「lastinsertid error Uncaught Error: Call to undefined method PDOStatement::lastInsertId() in~」

というエラーでPHPが実行停止するため、PDOオブジェクトが正しいか確認してみましょう。

主キーがAUTO_INCREMENTではない

INSERTされたテーブルの主キーが自動連番で割り当てるAUTO_INCREMENTではない場合も、自動連番は取得できず、0が返ってきます。

その場合はIDを手動で設定しているはずなので、そもそもlastInsertIdは使う必要などありませんね。


連番で割り当てられたIDを取得したいケースは、開発において多々あるので、lastInsertIdの使い方は覚えておきましょう。

以上、PDOのINSERT文で挿入されたIDを取得するlastInsertIdの使い方、でした。

PHP