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

PHP가 아닌 SQL 함수이기 때문입니다. 사용할 수 있습니다 PDO::lastInsertId().

처럼:

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

PDO API 대신 SQL로 수행하려면 일반 선택 쿼리처럼 수행하십시오.

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

1
네 맞아요, 내가 찾았
는데

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 PDO 인스턴스를 기반으로하는 연결의 마지막으로 삽입 된 ID가됩니다. 즉, 동시 쿼리가 별도의 연결에서 발생하므로 설명 된 시나리오에서 안전합니다.
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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.