PDOは最後に挿入されたIDを取得します


158

クエリがあり、最後に挿入された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()

何が悪いのですか?

回答:


367

これは、PHPではなくSQL関数であるためです。使用できますPDO::lastInsertId()

お気に入り:

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

PDO APIの代わりにSQLを使用する場合は、通常の選択クエリのように実行します。

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

1
はい、そうです。私はそれを見つけ、それが機能しました。ありがとう、私は答えを受け入れます
ウィリアム・キナン

7
@ rybo111、最初はScreaming snake caseです。第二に、MySQLの命名規則だとPHPではありません
azerafati

2
@ rybo111、hmm SELECT LAST_INSERT_ID()はMySQL関数
azerafati 2015

32
おそらくこれは馬鹿げたフォローアップの質問ですが、私は確かにしたいだけです。lastInsertId()を使用すると、現在実行中のコード内で発生した最後に挿入されたIDが返されますか?または、データベース全体から最後に挿入されたIDを返しますか?たとえば、トラフィック量の多いWebサイトがあり、ログインスクリプトの間に何かを挿入し、lastInsertId()を使用して挿入されたiDを取得しているが、多くの人が同時にログインしている場合、lastInsertId( )コード実行の特定のインスタンスから最後に挿入されたIDを取得するには?それともリスクを冒すか
Art Geigel

41
@ArtGeigelこれは、PDOインスタンスの基礎となる接続の最後に挿入されたIDになります。言い換えると、同時クエリは別々の接続で行われるため、前述のシナリオでは安全です。
コービン

15

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.