簡體   English   中英

PDO lastInsertId() 總是返回 0

[英]PDO lastInsertId() always return 0

我遇到了一個問題。 我的框架在 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 查詢獲得最后一個 ID 之前幫助我解決這個問題,我將非常高興(:

除了 php/PDO 或您的框架中的錯誤之外,還有兩種可能性。 lastInsertId()在與插入不同的 MySQL 連接上調用,或者您在應用程序/框架中生成 id 並插入它,而不是讓 auto_increment 為您生成它。 表中哪一列是主鍵/auto_increment? 該列是否包含在create()函數的$attributes中?

您可以測試 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"

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

另一個問題可能是使用 $pdo->exec($sql) 而不是 $pdo->query($sql)。

當您使用 $pdo->lastInsertId() 時,exec($sql) 將始終返回 0。 所以改用 query() 。

當沒有拋出異常時,lastInsertId 返回 0。但是,如果在調用 commit 之前調用 lastInsertId,則返回正確的 id。

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

由於外鍵約束,當最后一個插入語句失敗時,我得到了一個 0。 last_error 是一個字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM