我遇到了一个问题。我的框架在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();
}
database.php中
public function crudQuery($sql, $data) {
$sth = $this->handler->prepare($sql);
return $sth->execute($data);
}
调用第一个create()
方法,然后调用crudQuery()
方法。
正如我之前提到的,我可以将数据成功添加到MySQL数据库中。
不幸的是,当我调用lastInsterID()
方法时,它总是返回0.
如果您能在我使用SQL查询获取最后一个ID之前能帮助解决这个问题,我将非常高兴(:
答案 0 :(得分:20)
除了php / PDO或您的框架中的错误之外,还有两种可能性。在与插入不同的MySQL连接上调用lastInsertId()
,或者在应用程序/框架中生成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"
答案 1 :(得分:1)
另一个问题可能是使用$ pdo-> exec($ sql)而不是$ pdo-> query($ sql)。
使用$ pdo-> lastInsertId()时,exec($ sql)将始终返回0。因此,请改用query()。
答案 2 :(得分:0)
提交事务后,PDO :: lastInsertID()将返回0,因此最好在提交事务之前调用此方法。
答案 3 :(得分:0)
当最后一个插入语句由于外键约束而失败时,我得到0。 last_error是一个字符串。