問題に遭遇しました。私のフレームワークは 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"