20

我遇到了一个问题。我的框架在 PHP 5.3.0 上运行良好。我将我的 PHP 版本升级到 PHP 5.4.x,我的框架的某些部分开始出现一些问题。

PHP 版本升级后,PDO lastInsterId()总是返回0.

我有一个名为 的自动增量字段id。它将数据添加到数据库中没有任何问题。

出于某种原因,我一直将 0 作为最后一个插入 ID。

这是我的代码;

数据库对象.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 获得最后一个 ID 之前帮助我解决这个问题,我将非常高兴(:

4

5 回答 5

26

除了 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');

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

string(1) "1"
于 2012-08-02T12:06:35.410 回答
7

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

于 2017-10-03T13:50:52.390 回答
2

另一个问题可能是使用 $pdo->exec($sql) 而不是 $pdo->query($sql)。

当您使用 $pdo->lastInsertId() 时,exec($sql) 将始终返回 0。所以使用 query() 代替。

于 2018-07-15T14:34:40.103 回答
1

当没有抛出异常时,lastInsertId 返回 0。但是,如果在调用 commit 之前调用了 lastInsertId,则返回正确的 id。

http://php.net/manual/es/pdo.lastinsertid.php

于 2018-05-10T16:12:28.970 回答
0

当最后一个插入语句由于外键约束而失败时,我得到一个 0。last_error 是一个字符串。

于 2018-05-03T17:15:02.970 回答