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?

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();

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.