2011-08-02 17 views
14

Używam PDO po raz pierwszy z MySQL, po prostu bawi się z nim w tej chwili.PDO lastInsertId nie działa przy transakcjach?

Do tej pory, gdy próbuję zrobić wkładkę owinięte w transakcjach ...

$this->dbh->beginTransaction(); 
// $sql query ran 
$this->dbh->commit(); 

echo $this->dbh->lastInsertId(); 

lastInsertId() zwraca 0 ... kiedy uruchomić tę samą kwerendę poza transakcji, uzyskać właściwe zwrócono numer identyfikacyjny. Czy jest coś, czego tu brakuje?

+4

nazywają go przed popełnieniem transakcji. –

+3

Natknąłeś się na paskudny zwyczaj PDO, tak, musisz zadzwonić do 'lastInsertId' _before_' commit', co jest uciążliwe, ale łatwe do zapamiętania. – Wrikken

+1

@Wrikken: Nie sądzę, że jest to paskudne i prawdopodobnie nawet zamierzone zachowanie, ponieważ transakcje są często używane do wykonywania wielu instrukcji 'INSERT'. Tak więc, aby uzyskać 'lastInsertId' z, powiedzmy, pierwszej instrukcji' INSERT' w transakcji 3 instrukcji 'INSERT', zawsze będziesz musiał wywołać' lastInsertId' przed wykonaniem 'commit', ponieważ ty ' Musimy wywołać to przed pozostałymi 2 instrukcjami '' INSERT'. –

Odpowiedz

26

Musisz poprosić o lastInsertId(), zanim zdecydują się transaction

Spróbuj

$this->dbh->beginTransaction(); 
// $sql query ran 
echo $this->dbh->lastInsertId(); 
$this->dbh->commit(); 
+0

Sprawdź również [to] (http://www.php.net/manual/en/pdo.lastinsertid.php#85129). – Starx

+0

To właśnie uratowało mnie przed wyskoczeniem przez okno. DZIĘKI! –

Powiązane problemy