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

นั่นเป็นเพราะนั่นคือฟังก์ชัน SQL ไม่ใช่ PHP PDO::lastInsertId()คุณสามารถใช้

ชอบ:

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

ถ้าคุณต้องการที่จะทำกับ SQL แทน PDO API คุณจะทำมันเหมือนแบบสอบถามเลือกปกติ:

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

1
ใช่คุณถูกต้องฉันพบมันและใช้งานได้ดีขอบคุณฉันจะยอมรับคำตอบ
William Kinaan

7
@ rybo111 ก่อนScreaming snake caseอื่นเลย ที่สองคือการตั้งชื่อ MySQL และไม่ใช่ PHP
azerafati

2
@ rybo111, hmm SELECT LAST_INSERT_ID()เป็นฟังก์ชั่น MySQL
azerafati

32
ดังนั้นบางทีนี่อาจเป็นคำถามติดตามที่เป็นใบ้ แต่ฉันแค่อยากจะแน่ใจ เมื่อฉันพึ่ง lastInsertId () มันส่งคืน ID ที่แทรกล่าสุดที่เกิดขึ้นในรหัสที่ฉันกำลังใช้งานอยู่ใช่ไหม? หรือว่าจะส่งคืน ID ที่แทรกล่าสุดจากทั่วฐานข้อมูลของฉัน ตัวอย่างเช่นหากฉันมีเว็บไซต์ที่ถูกค้ามนุษย์อย่างหนักและฉันแทรกบางอย่างระหว่างสคริปต์การเข้าสู่ระบบของฉันและใช้ lastInsertId () เพื่อรับ iD ที่แทรกไว้ แต่ผู้คนจำนวนมากกำลังเข้าสู่ระบบในเวลาเดียวกันฉันปลอดภัยที่จะพึ่งพา lastInsertId ( ) เพื่อรับ ID ที่แทรกล่าสุดจากอินสแตนซ์เฉพาะของการเรียกใช้โค้ด? หรือฉันจะเสี่ยง
Art Geigel

41
@ArtGeigel มันจะเป็น ID ที่แทรกล่าสุดของการเชื่อมต่อที่อยู่ภายใต้อินสแตนซ์ PDO กล่าวอีกนัยหนึ่งมันปลอดภัยในสถานการณ์ที่คุณอธิบายเนื่องจากเคียวรีที่เกิดขึ้นพร้อมกันจะเกิดขึ้นในการเชื่อมต่อที่แยกต่างหาก
Corbin

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

-5

คุณสามารถรับ id ของการทำธุรกรรมครั้งล่าสุดได้โดยใช้วิธี lastInsertId () บนวัตถุการเชื่อมต่อ ($ conn)

เช่นนี้ $ lid = $ conn-> lastInsertId ();

กรุณาตรวจสอบเอกสารได้ที่ https://www.php.net/manual/th/language.oop5.basic.php


2
ยินดีต้อนรับสู่ Stack Overflow เราให้ความสำคัญกับผลงานที่เป็นประโยชน์ แต่โปรดอย่าทำซ้ำคำตอบที่มีอยู่
สามัญสำนึกของคุณ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.