2017-11-29 9 views
0

저는 PDO를 배우려고합니다.PDO에서 마지막으로 삽입 된 ID를 가져 오기 위해 lastInsertId()를 호출하기 직전에 새 레코드를 삽입해야합니까?

먼저 아래 코드를 사용하여 테이블에 레코드를 성공적으로 삽입했습니다.

<?php 
    $servername = "localhost"; 
    $username = "root"; 
    $password = ""; 
    $dbname = "myDBPDO"; 

    try { 
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); 
    // set the PDO error mode to exception 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $sql = "INSERT INTO MyGuests (firstname, lastname, email) 
    VALUES ('John', 'Doe', '[email protected]')"; 
    // use exec() because no results are returned 
    $conn->exec($sql); 
    echo "New record created successfully"; 
    } 
    catch(PDOException $e) { 
    echo $sql . "<br>" . $e->getMessage(); 
    } 

    $conn = null; 
?> 

그럼, 마지막으로 삽입 된 레코드의 ID를 얻기 위해 노력했다. 나는 그것을 위해 다음 코드를 작성 :

<?php 
    $servername = "localhost"; 
    $username = "root"; 
    $password = ""; 
    $dbname = "myDBPDO"; 

    try { 
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); 
    // set the PDO error mode to exception 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $last_id = $conn->lastInsertId(); 
    echo "Last inserted ID is: " . $last_id; 
    } 
    catch(PDOException $e) { 
    echo $sql . "<br>" . $e->getMessage(); 
    } 

    $conn = null; 
?> 

은 다음 (두 번째 코드) 위의 출력이 될 때 :

Last inserted ID is: 1 

: 사실

Last inserted ID is: 0 

, 나는 아래의 출력을 얻을 것으로 예상 은 첫 번째 프로그램에 삽입 한 레코드의 ID 필드 값입니다.

위에 명시된 예상 출력을 반환하지 않는 이유는 무엇입니까?

PDO에서 마지막으로 삽입 된 ID를 얻기 위해 lastInsertId()를 호출하기 전에 새 레코드를 삽입해야합니까?

그렇다면 작성한 두 번째 코드 스 니펫을 사용하여 lastInsertId()를 호출하기 전에 새 레코드를 삽입하지 않고 마지막 삽입 된 ID를 어떻게 얻을 수 있습니까? 그렇지 않다면 그 이유는 무엇입니까?

+1

INSERT를 한 직후 lastInsertId를 얻지 못하는 이유에 대해 혼란 스럽습니다 ... 왜 개별적으로하고 있습니까? – antfuentes87

답변

1

기본 데이터베이스 호출 LAST_INSERT_ID()은 연결 단위로 작동합니다. 당신이 연결을 끊을 경우, 값은

연결별로에 서버에서 유지되고 생성 된 ID

을 잃게됩니다. 이 함수에 의해 주어진 클라이언트에 리턴 값이

그래서 귀하의 질문에 대답하기 위해 해당 클라이언트에 의해 AUTO_INCREMENT에 영향을 미치는 가장 최근 문에 대해 생성 된 첫 번째 AUTO_INCREMENT 값이 ... 있음을 의미

PDO에서 마지막으로 삽입 된 ID를 가져 오기 위해 lastInsertId()를 호출하기 바로 전에 새 레코드를 삽입해야합니까?

네, 맞습니다.


내가

당신은 거의 최대 ID 값

$maxId = $conn->query('SELECT MAX(id) FROM MyGuests')->fetchColumn(); 

대안을 가져 오는 제한하고 새 레코드를 삽입하지 않고 마지막으로 삽입 된 ID를 어떻게 가야 저장 두 번째 스크립트에서 검색 할 수있는 어딘가의 첫 번째 스크립트 값 lastInsertId().