2012-05-21 12 views
104

Mam zapytanie i chcę uzyskać ostatni wstawiony identyfikator. Identyfikator pola jest kluczem podstawowym i automatycznym inkrementowaniem.PDO otrzyma ostatni wstawiony identyfikator

wiem, że muszę skorzystać z tej klauzuli:

LAST_INSERT_ID() 

Stwierdzenie współpracuje z zapytaniem jak to:

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

Ale jeśli chcę uzyskać identyfikator za pomocą tego komunikatu:

$ID = LAST_INSERT_ID(); 

otrzymuję ten błąd:

Fatal error: Call to undefined function LAST_INSERT_ID() 

Co robię źle?

Odpowiedz

220

To dlatego, że jest to funkcja SQL, a nie PHP. Możesz użyć PDO::lastInsertId().

odczuwalna:

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

Jeśli chcesz to zrobić z SQL zamiast API PDO, byś go jak normalny kwerendy wybierającej:

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

tak pan rację, uważam, że to i to działa, dziękuję, ja zaakceptuje odpowiedź –

+2

@IllyasMimouni można wyjaśnić w jaki sposób twoja edycja oferuje więcej zabezpieczeń? Zawijanie pojedynczego wyciągu w transakcji nic nie oferuje. – Corbin

+0

@Corbin: Usuwam część, miałeś rację. – Mimouni

4

lastInsertId() działa tylko po zapytanie INSERT.

Poprawnie:

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

Niepoprawnie:

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

Zły przykład, zmienne nie mają miejsca w zapytaniach. Użyj przygotowanych oświadczeń: http://php.net/manual/en/pdo.prepared-statements.php –

Powiązane problemy