20

問題が発生しました。私のフレームワークは、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 Query (:

4

5 に答える 5

26

php/PDO またはフレームワークのバグ以外に、2 つの可能性があります。挿入とは異なる MySQL 接続で呼び出されるかlastInsertId()、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"
于 2012-08-02T12:06:35.410 に答える