Pytanie w sprawie mysql, database, pdo, php – PDO wstawia ostatni identyfikator

131

Mam zapytanie i chcę wstawić ostatni identyfikator. Identyfikator pola to klucz podstawowy i automatyczne zwiększanie.

Wiem, że muszę użyć tego oświadczenia:

LAST_INSERT_ID()

Ta instrukcja działa z zapytaniem takim jak to:

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

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

$ID = LAST_INSERT_ID();

Dostaję ten błąd:

Fatal error: Call to undefined function LAST_INSERT_ID()

Co ja robię źle?

Twoja odpowiedź

2   odpowiedź
6

lastInsertId () działa tylko po zapytaniu INSERT.

Poprawny:

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

Błędny:

$stmt = $this->conn->prepare("SELECT * FROM users");
$sonuc = $stmt->execute();
$LAST_ID = $this->conn->lastInsertId(); //always return string(1)=0
Zły przykład, zmienne nie mają miejsca w zapytaniach. Użyj przygotowanych wyciągów:php.net/manual/en/pdo.prepared-statements.php Wouter van Eekelen
286

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

Lubić:

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

Jeśli chcesz to zrobić za pomocą SQL zamiast API PDO, zrobiłbyś to jak normalne zapytanie:

$stmt = $db->query("SELECT LAST_INSERT_ID()");
$lastId = $stmt->fetchColumn();
@ rybo111, po pierwszeScreaming snake case. po drugie, jest to konwencja nazewnictwa MySQL i nie jest PHP azerafati
Dla zainteresowanych:lastInsertId jestcamelCase iLAST_INSERT_ID jestsnake_case. Niestety, PHP nie trzyma się żadnej z konwencji nazewnictwa. rybo111
tak, masz rację, znalazłem to i działa, dziękuję, zaakceptuję odpowiedź William Kinaan
@ rybo111, hmmSELECT LAST_INSERT_ID() jest funkcją MySQL azerafati

Powiązane pytania