2009-02-03 18 views
5

Sto cercando di recuperare l'ultimo ID di riga inserito di un database Sqlite nella mia applicazione PHP. Sto usando l'adattatore Sqlite PDO di Zend Framework per la gestione del database. il metodo lastInsertId() dovrebbe darmi i risultati, ma non lo farebbe. Nella documentazione PDO in php.net ho letto che l'ultimoInsertId() potrebbe non funzionare lo stesso su tutti i database. ma non funzionerebbe affatto su sqlite? Ho provato di sovrascrivere il metodo lastInsertId() dell'adattatore da questo:come ottenere l'ultimo ID di un database Sqlite utilizzando Zend_Db

// Zend_Db_Adapter_Pdo_Sqlite 
public function lastInsertId() { 
    $result = $this->_connection->query('SELECT last_insert_rowid()')->fetch(); 
    return $result[0]; 
} 

ma non funziona neanche. restituisce 0 ogni volta che lo chiamo. c'è qualche modo pulito speciale per trovare l'ultimo ID inserito?

risposta

10

Dato un database SQLite3 con un tavolo b, come segue:

BEGIN TRANSACTION; 
CREATE TABLE b(a integer primary key autoincrement, b varchar(1)); 
COMMIT; 

Questo codice mi dà un lastInsertId:

public function lastInsertId() { 
    $result = $this->_connection->query('SELECT last_insert_rowid() as last_insert_rowid')->fetch(); 
    return $result['last_insert_rowid']; 
} 

che è - se la tabella è definita correttamente, il vostro unico problema è probabile che tu abbia provato a recuperare la chiave $ result [0] - anche, ogni volta che usi una colonna calcolata, ti consiglio di creare aliasing della colonna usando la parola chiave "AS" come ho dimostrato sopra. Se non si desidera eseguire l'alias della colonna, in SQLite3 la colonna deve essere denominata "last_insert_rowid()".

+0

ha funzionato bene. anche il Zend_Db_Adapter_Pdo_Sqlite :: lastInsertId() ha funzionato. il mio problema era la definizione di autoincremento. Grazie. – farzad

+0

Cosa, nessun credito per la risposta? ;) – TML

+0

sì certo. Grazie. ;) – farzad

-4

Ehi, prova questa query. Ma non so di PHP.

SELECT * 
FROM tablename 
WHERE id = (SELECT COUNT(*) FROM tablename); 
+0

Ho visto situazioni in cui gli ultimi valori ID non sono correlati al numero di righe nel database, ad esempio prima ci sono state alcune righe cancellate. quindi non penso che l'uso di count (*) sia un buon approccio – farzad

-1
SELECT * FROM [tablename] ORDER BY id DESC LIMIT 1 
+0

Questo è considerato una cattiva pratica in generale. A) per restituire il risultato corretto per l'accesso simultaneo, deve essere incapsulato in una transazione serializzabile o avere la tabella bloccata, e B) è una query aggiuntiva (non necessaria) quando il DBMS supporta la restituzione dell'ultimo ID di inserimento (in questo caso lo fa). –

0

Non utilizzare

SELECT * FROM tablename WHERE id = (SELECT COUNT(*) FROM tablename); 

invece utilizzare

SELECT MAX(id) as id FROM tablename LIMIT 1; 

o

SELECT id FROM tablename ORDER DESC LIMIT 1; 
Problemi correlati