PDO memasukkan ID terakhir

158

Saya punya pertanyaan, dan saya ingin memasukkan ID terakhir. ID bidang adalah kunci utama dan penambahan otomatis.

Saya tahu bahwa saya harus menggunakan pernyataan ini:

LAST_INSERT_ID()

Pernyataan itu berfungsi dengan kueri seperti ini:

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

Tetapi jika saya ingin mendapatkan ID menggunakan pernyataan ini:

$ID = LAST_INSERT_ID();

Saya mendapatkan kesalahan ini:

Fatal error: Call to undefined function LAST_INSERT_ID()

Apa yang saya lakukan salah?

William Kinaan
sumber

Jawaban:

367

Itu karena itu fungsi SQL, bukan PHP. Anda bisa menggunakannya PDO::lastInsertId().

Suka:

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

Jika Anda ingin melakukannya dengan SQL alih-alih API PDO, Anda akan melakukannya seperti kueri pemilihan normal:

$stmt = $db->query("SELECT LAST_INSERT_ID()");
$lastId = $stmt->fetchColumn();
Corbin
sumber
1
ya Anda benar, saya menemukannya dan berfungsi, terima kasih, saya akan menerima jawaban
William Kinaan
7
@ rybo111, pertama itu Screaming snake case. kedua, ini adalah konvensi penamaan MySQL dan bukan PHP
azerafati
2
@ rybo111, hmm SELECT LAST_INSERT_ID()adalah fungsi MySQL
azerafati
32
Jadi mungkin ini adalah pertanyaan lanjutan bodoh tapi saya hanya ingin memastikan. Ketika saya mengandalkan lastInsertId () apakah itu mengembalikan ID yang dimasukkan terakhir yang terjadi di dalam kode saya saat ini mengeksekusi? Atau apakah itu mengembalikan ID yang dimasukkan terakhir dari seluruh basis data saya? Misalnya, jika saya memiliki situs web yang sangat diperdagangkan dan saya memasukkan sesuatu selama skrip login saya dan menggunakan lastInsertId () untuk mendapatkan iD yang dimasukkan, tetapi banyak orang yang masuk pada saat yang sama, apakah saya aman untuk mengandalkan lastInsertId () ) untuk mendapatkan ID yang disisipkan terakhir dari instance khusus dari eksekusi kode? Atau apakah saya mengambil risiko
Seni Geigel
41
@ ArtGeigel Ini akan menjadi ID yang dimasukkan terakhir dari koneksi yang mendasari instance PDO. Dengan kata lain, aman dalam skenario yang Anda gambarkan karena permintaan bersamaan akan terjadi dalam koneksi terpisah.
Corbin
15

lastInsertId () hanya berfungsi setelah kueri INSERT.

Benar:

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

Salah:

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

Anda bisa mendapatkan id dari transaksi terakhir dengan menjalankan metode lastInsertId () pada objek koneksi ($ conn).

Seperti ini $ lid = $ conn-> lastInsertId ();

Silakan periksa dokumen https://www.php.net/manual/en/language.oop5.basic.php

Kanton Samad
sumber
2
Selamat datang di Stack Overflow. Kami menghargai kontribusi yang bermanfaat tetapi jangan menduplikasi jawaban yang ada.
Akal Sehat Anda