PDO lastInsertId() は常に 0 を返します 質問する

PDO lastInsertId() は常に 0 を返します 質問する

問題に遭遇しました。私のフレームワークは PHP 5.3.0 では問題なく動作していました。PHP バージョンを PHP 5.4.x にアップグレードしたところ、フレームワークの一部に問題がいくつか発生し始めました。

PHP バージョンのアップグレード後はPDO lastInsterId()常に を返します0

という自動増分フィールドがありますid。問題なくデータベースにデータが追加されています。

何らかの理由で、最後の挿入 ID として 0 が返され続けます。

これが私のコードです。

データベースオブジェクト.php

public static function create () {
        global $db;
        $attributes = self::sanitize(static::$fields);

        $sql  = "INSERT INTO ".PREFIX.static::$table_name." (";
        $sql .= join(", ", array_keys($attributes));
        $sql .= ") VALUE (:";
        $sql .= join(", :", array_keys($attributes));
        $sql .= ")";

        return ($db->crudQuery($sql, $attributes)) ? true : false;
    }

public static function lastInsertID () {
        global $db;
        return $db->handler->lastInsertId();
    }

データベース.php

public function crudQuery($sql, $data) {
        $sth = $this->handler->prepare($sql);
        return $sth->execute($data);
    }

最初のcreate()メソッドが呼び出され、次にcrudQuery()メソッドが呼び出されます。 前に述べたように、データを MySQL データベースに正常に追加できます。 残念ながら、lastInsterID()メソッドを呼び出すと、常に 0 が返されます。

SQLクエリで最後のIDを取得する前に、この問題を解決していただければ本当にうれしいです(:

ベストアンサー1

php/PDO またはフレームワークのバグ以外に、2 つの可能性があります。lastInsertId()挿入とは異なる MySQL 接続で呼び出されるか、auto_increment で ID を生成させるのではなく、アプリケーション/フレームワークで ID を生成して挿入しています。テーブルのどの列が主キー/auto_increment ですか? その列は関数$attributesに含まれていますかcreate()?

次のコード (新しいファイル内) を使用して PDO をテストし、その部分が正しく動作していることを確認できます。

// Replace the database connection information, username and password with your own.
$conn = new PDO('mysql:dbname=test;host=127.0.0.1', 'user', 'password');

$conn->exec('CREATE TABLE testIncrement ' .
            '(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50))');
$sth = $conn->prepare('INSERT INTO testIncrement (name) VALUES (:name)');
$sth->execute([':name' => 'foo']);
var_dump($conn->lastInsertId());
$conn->exec('DROP TABLE testIncrement');

このスクリプトを実行すると、出力は次のようになりました。

string(1) "1"

おすすめ記事