PDO lastInsertId() always return 0

前端 未结 5 400
花落未央
花落未央 2020-11-29 12:14

I\'ve come across with a problem. My framework was working just fine with PHP 5.3.0. I upgraded my PHP version to PHP 5.4.x and I started to have few issues with some parts

相关标签:
5条回答
  • 2020-11-29 12:28

    The one other problem could be using $pdo->exec($sql) instead of $pdo->query($sql).

    exec($sql) will return always 0 when you use $pdo->lastInsertId(). So use query() instead.

    0 讨论(0)
  • 2020-11-29 12:28

    I got a 0 when the last insert statement failed due to a foreign key contraint. last_error was a string.

    0 讨论(0)
  • 2020-11-29 12:38

    When no exception is thrown, lastInsertId returns 0. However, if lastInsertId is called before calling commit, the right id is returned.

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

    0 讨论(0)
  • 2020-11-29 12:41

    Other than a bug in php/PDO or your framework, there are two possibilities. Either lastInsertId() is called on a different MySQL connection than the insert, or you are generating the id in your application/framework and inserting it, rather than letting auto_increment generate it for you. Which column in the table is the primary key/auto_increment? Is that column included in $attributes in your create() function?

    You can test PDO to make sure that part is working correctly with this code (in a new file):

    // 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');
    

    When I ran this script, the output was

    string(1) "1"
    
    0 讨论(0)
  • 2020-11-29 12:42

    After you commit a transaction PDO::lastInsertID() will return 0, so best to call this method before the transaction is committed.

    0 讨论(0)
提交回复
热议问题