2009-02-03 7 views
5

J'essaie de récupérer la dernière ligne insérée d'une base de données Sqlite dans mon application PHP. J'utilise l'adaptateur PDO Sqlite de Zend Framework pour le traitement de la base de données. la méthode lastInsertId() est supposée me donner les résultats, mais ce n'est pas le cas. Dans la documentation PDO de php.net, j'ai lu que lastInsertId() peut ne pas fonctionner de la même manière sur toutes les bases de données. mais ne fonctionnerait-il pas sur sqlite du tout? J'ai essayé d'écraser la méthode lastInsertId() de l'adaptateur par ceci:comment obtenir la dernière insérée Id d'une base de données Sqlite en utilisant Zend_Db

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

mais il ne fonctionne pas non plus. retourne juste 0 chaque fois que je l'appelle. existe-t-il un moyen propre spécial pour trouver le dernier Id inséré?

Répondre

10

Compte tenu d'une base de données SQLite3 avec une table b, comme suit:

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

Ce code me donne un lastInsertId:

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

C'est - si votre table est correctement définie, votre seul problème est probablement que vous avez essayé d'extraire la clé $ result [0] - aussi, chaque fois que vous utilisez une colonne calculée, je recommande d'aliaser la colonne en utilisant le mot-clé "AS" comme je l'ai démontré plus haut. Si vous ne voulez pas aliaser la colonne, dans SQLite3, la colonne doit être nommée "last_insert_rowid()".

+0

cela a bien fonctionné. même le Zend_Db_Adapter_Pdo_Sqlite :: lastInsertId() a fonctionné. mon problème était la définition de l'auto-incrémentation. Merci. – farzad

+0

Quoi, pas de crédit pour la réponse? ;) – TML

+0

ouais bien sûr. Merci. ;) – farzad

-4

Hé, essayez cette requête. Mais je ne sais pas pour PHP.

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

J'ai vu des situations où les dernières valeurs d'ID ne sont pas liées au nombre de lignes dans la base de données, par exemple certaines lignes ont été supprimées auparavant. donc je ne pense pas utiliser count (*) est une bonne approche – farzad

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

Ceci est considéré comme une mauvaise pratique en général. A) afin de retourner le résultat correct pour l'accès simultané, il doit être encapsulé dans une transaction sérialisable ou avoir la table verrouillée, et B) c'est une requête supplémentaire (inutile) lorsque le SGBD supporte le retour du dernier identifiant d'insertion (dans ce cas) Cela fait). –

0

Ne pas utiliser

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

utiliser à la place

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

ou

SELECT id FROM tablename ORDER DESC LIMIT 1; 
Questions connexes