PDO lấy ID cuối cùng được chèn


158

Tôi có một truy vấn và tôi muốn nhận ID cuối cùng được chèn. ID trường là khóa chính và tự động tăng.

Tôi biết rằng tôi phải sử dụng tuyên bố này:

LAST_INSERT_ID()

Câu lệnh đó hoạt động với một truy vấn như thế này:

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

Nhưng nếu tôi muốn lấy ID bằng tuyên bố này:

$ID = LAST_INSERT_ID();

Tôi nhận được lỗi này:

Fatal error: Call to undefined function LAST_INSERT_ID()

Tôi đang làm gì sai?

Câu trả lời:


367

Đó là bởi vì đó là một hàm SQL, không phải PHP. Bạn có thể sử dụng PDO::lastInsertId().

Giống:

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

Nếu bạn muốn làm điều đó với SQL thay vì API PDO, bạn sẽ làm điều đó giống như một truy vấn chọn thông thường:

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

1
vâng bạn đúng, tôi đã tìm thấy nó và nó hoạt động, cảm ơn bạn, tôi sẽ chấp nhận câu trả lời
William Kinaan

7
@ rybo111, đầu tiên là nó Screaming snake case. thứ hai, đó là quy ước đặt tên MySQL và không phải là PHP
azerafati

2
@ rybo111, hmm SELECT LAST_INSERT_ID()là một chức năng của MySQL
azerafati

32
Vì vậy, có lẽ đây là một câu hỏi tiếp theo ngu ngốc nhưng tôi chỉ muốn chắc chắn. Khi tôi dựa vào lastInsertId () thì nó có trả lại ID được chèn cuối cùng xảy ra trong mã hiện đang thực thi của tôi không? Hoặc nó trả về ID được chèn cuối cùng từ cơ sở dữ liệu của tôi? Ví dụ: nếu tôi có một trang web bị buôn bán nặng và tôi chèn một cái gì đó trong tập lệnh đăng nhập của mình và sử dụng lastInsertId () để lấy iD được chèn, nhưng nhiều người đang đăng nhập cùng một lúc, tôi có an toàn khi dựa vào lastInsertId ( ) để lấy ID được chèn cuối cùng từ trường hợp thực thi mã cụ thể đó? Hay tôi gặp rủi ro
Art Geigel

41
@ArtGeigel Đây sẽ là ID được chèn cuối cùng của kết nối bên dưới thể hiện PDO. Nói cách khác, nó an toàn trong kịch bản bạn mô tả do các truy vấn đồng thời sẽ diễn ra trong các kết nối riêng biệt.
Corbin

15

lastInsertId () chỉ hoạt động sau truy vấn INSERT.

Chính xác:

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

Sai:

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

-5

Bạn có thể lấy id của giao dịch cuối cùng bằng cách chạy phương thức lastInsertId () trên đối tượng kết nối ($ Conn).

Giống như $ cap = $ Conn-> lastInsertId ();

Vui lòng kiểm tra các tài liệu https://www.php.net/manual/en/lingu.oop5.basic.php


2
Chào mừng bạn đến với Stack Overflow. Chúng tôi đánh giá cao những đóng góp hữu ích nhưng xin vui lòng không lặp lại các câu trả lời hiện có.
Ý thức chung của bạn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.