| 
        php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login | 
  [2018-09-17 14:43 UTC] symos at yahoo dot com
 Description:
------------
When executing an INSERT query and then immediately running PDO::lastInsertId(), the value it returns is correct. But if a SELECT query is executed in between, lastInsertId returns 0. This did not happen in PHP 5.5.9.
If you run "SELECT LAST_INSERT_ID();" as a raw query (even through PDO) the result you get is correct. 
I can't be sure if this is a bug or was changed intentionally, but I would argue it's not correct for PDO's lastInsertId to return a different value than MySQL's LAST_INSERT_ID().
Test script:
---------------
<?php
$username = "username";
$password = "password";    
$pdo = new PDO("mysql:host=127.0.0.1;port=3306;dbname=test_db", $username, $password);
    
$pdo->query("CREATE TABLE IF NOT EXISTS `test_table` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `random_field` int(11) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;");
$st = $pdo->query("INSERT INTO test_table(random_field) VALUES (" . rand(1, 100000) . ")");
    
if($st){
        echo "last_insert_id: " . $pdo->lastInsertId() . "\n";
        $pdo->query("SELECT 1 + 1");
        echo "last_insert_id: " . $pdo->lastInsertId() . "\n";
}
else {
        var_dump($pdo->errorInfo());
}
Expected result:
----------------
Both values should reflect ID of last inserted record
Actual result:
--------------
Second value is zero
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits             
             | 
    |||||||||||||||||||||||||||||||||||||
            
                 
                Copyright © 2001-2025 The PHP GroupAll rights reserved.  | 
        Last updated: Tue Nov 04 13:00:02 2025 UTC | 
I'm seeing the same behavior when doing a statement using ON DUPLICATE KEY UPDATE: php 7.2.10 'INSERT INTO BLAH (field) values ('blah') ON DUPLICATE KEY UPDATE id = last_insert_id(id), field = 'blah2'; Passing the ID to last_insert_id() tells mysql the value to return in the next last_insert_id() call. The issue here is the PDO gets a 'number of rows affected' response of 1 if the row was created or 2 if the row was updated.