5

PHP アプリケーションで Sqlite DB の最後に挿入された行 ID をフェッチしようとしています。データベース処理に Zend Framework の PDO Sqlite アダプターを使用しています。lastInsertId() メソッドで結果が得られるはずですが、そうではありません。php.net の PDO ドキュメントで、lastInsertId() がすべてのデータベースで同じように機能しない可能性があることを読みました。しかし、sqliteではまったく機能しませんか? アダプターの lastInsertId() メソッドを次のように上書きしてみました。

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

しかし、それも機能しません。呼び出すたびに 0 を返します。最後に挿入されたIDを見つけるための特別なクリーンな方法はありますか?

4

5 に答える 5

11

次のように、 table を持つ SQLite3 データベースが与えられbます。

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

このコードは私に与えますlastInsertId

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

つまり、テーブルが正しく定義されている場合、唯一の問題は、キー $result[0] をフェッチしようとしたことである可能性があります。また、計算列を使用している場合は常に、「AS」を使用して列のエイリアスを作成することをお勧めします上で示したキーワード。列に別名を付けたくない場合は、SQLite3 で列に「last_insert_rowid()」という名前を付ける必要があります。

于 2009-02-03T07:52:43.417 に答える
1

PDO::lastInserId()

参照: http://us2.php.net/manual/en/pdo.lastinsertid.php

于 2011-01-10T19:34:25.280 に答える
0

使ってはいけません

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

代わりに使用する

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

また

SELECT id FROM tablename ORDER DESC LIMIT 1;
于 2012-03-02T12:45:34.253 に答える
-4

ねえ、このクエリを試してください。しかし、私はPHPについて知りません。

SELECT *
FROM tablename
WHERE id = (SELECT COUNT(*) FROM tablename);
于 2009-06-26T11:34:24.583 に答える