|
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: Wed Oct 29 12:00:01 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.