PDO lastInsertId()始终返回0

Rev*_*ant 15 php pdo lastinsertid

我遇到了一个问题.我的框架在PHP 5.3.0中运行得很好.我将我的PHP版本升级到PHP 5.4.x并且我开始在框架的某些部分遇到一些问题.

PHP版本升级后,PDO lastInsterId()始终返回0.

我有自动增量字段调用id.它正在将数据添加到数据库而没有任何问题.

出于某种原因,我持续获得0作为最后一个插入ID.

这是我的代码;

databaseobjects.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();
    }
Run Code Online (Sandbox Code Playgroud)

为database.php

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

create()调用第一个方法,然后crudQuery()调用方法.正如我之前提到的,我可以将数据成功添加到MySQL数据库中.不幸的是,当我调用lastInsterID()方法时,它总是返回0.

如果你能在我用SQL Query获取最后一个ID之前能帮助我解决这个问题,我将非常高兴(:

Gar*_*y G 20

除了php/PDO或您的框架中的错误,有两种可能性.要么lastInsertId()在与插入不同的MySQL连接上调用,要么在应用程序/框架中生成id并插入它,而不是让auto_increment为您生成它.表中的哪一列是主键/ 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');
Run Code Online (Sandbox Code Playgroud)

当我运行这个脚本时,输出是

string(1) "1"
Run Code Online (Sandbox Code Playgroud)


Har*_*wis 6

提交事务后 PDO::lastInsertID() 将返回 0,因此最好在提交事务之前调用此方法。