【PHP】PDOのINSERT文で挿入されたIDを取得するlastInsertIdの使い方
PHPのPDOオブジェクトには、最後のINSERTで挿入された行の連番IDを取得する機能があります。
今回はそんな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の使い方、でした。
ディスカッション
コメント一覧
$pdoと$sqlが、ごっちゃになっていませんか?
すいません、一部誤りがあったため修正しました。