PDO, eklenen son kimliği alır


158

Bir sorgum var ve son kimliği eklemek istiyorum. Alan kimliği birincil anahtar ve otomatik artan değerdir.

Bu ifadeyi kullanmam gerektiğini biliyorum:

LAST_INSERT_ID()

Bu ifade şöyle bir sorgu ile çalışır:

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

Ama bu ifadeyi kullanarak kimliği almak istiyorsanız:

$ID = LAST_INSERT_ID();

Bu hatayı alıyorum:

Fatal error: Call to undefined function LAST_INSERT_ID()

Neyi yanlış yapıyorum?

Yanıtlar:


367

Bunun nedeni PHP değil bir SQL işlevidir. Kullanabilirsiniz PDO::lastInsertId().

Sevmek:

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

PDO API yerine SQL ile yapmak istiyorsanız, bunu normal bir seçme sorgusu gibi yaparsınız:

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

1
evet haklısın, buldum ve işe yarıyor, teşekkür ederim, cevabı kabul
edeceğim

7
@ rybo111, önce Screaming snake case. ikincisi, bu MySQL adlandırma kuralı ve PHP değil
azerafati

2
@ rybo111, hmm SELECT LAST_INSERT_ID()bir MySQL işlevidir
azerafati

32
Belki de bu aptalca bir takip sorusu ama sadece emin olmak istiyorum. LastInsertId () 'a güvendiğimde, şu anda yürütülmekte olan kodumda gerçekleşen son eklenen kimliği döndürüyor mu? Yoksa veritabanımın son eklenen kimliğini döndürüyor mu? Örneğin, yoğun bir şekilde trafiğe eklenmiş bir web sitem varsa ve giriş komut dosyam sırasında bir şey ekler ve eklenen iD'yi almak için lastInsertId () öğesini kullanırsam, ancak birçok kişi aynı anda giriş yapıyorsa, lastInsertId ( ) kodun çalıştırıldığı o belirli örnekten son eklenen kimliği almak için? Yoksa risk mi
alıyorum

41
@ArtGeigel PDO örneğinin altında yatan bağlantının son girilen kimliği olacaktır. Başka bir deyişle, eşzamanlı sorgular ayrı bağlantılarda olacağından, tanımladığınız senaryoda güvenlidir.
Corbin

15

lastInsertId () yalnızca INSERT sorgusundan sonra çalışır.

Doğru:

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

Yanlış:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.