From 25dc931d83f96d760d047789321ce284b90dc85c Mon Sep 17 00:00:00 2001 From: matt Date: Mon, 26 Apr 2021 11:45:37 +0200 Subject: [PATCH] Fixed bug #80908 The last insert ID should be an unsigned integer. Closes GH-6810. --- NEWS | 3 ++ ext/pdo_mysql/mysql_driver.c | 2 +- ext/pdo_mysql/tests/bug80908.phpt | 49 +++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 ext/pdo_mysql/tests/bug80908.phpt diff --git a/NEWS b/NEWS index 7fdffd46e8ca4..cf30f3d2bc607 100644 --- a/NEWS +++ b/NEWS @@ -88,6 +88,9 @@ PHP NEWS . Fixed bug #40913 (PDO_MYSQL: PDO::PARAM_LOB does not bind to a stream for fetching a BLOB). (Nikita) +. PDO MySQL: + . Fixed bug#80908 (PDO::lastInsertId() return wrong). (matt) + . PDO SQLite: . Fixed bug #38334 (Proper data-type support for PDO_SQLITE). (Nikita) diff --git a/ext/pdo_mysql/mysql_driver.c b/ext/pdo_mysql/mysql_driver.c index 777003b9502af..7c34099be87df 100644 --- a/ext/pdo_mysql/mysql_driver.c +++ b/ext/pdo_mysql/mysql_driver.c @@ -289,7 +289,7 @@ static zend_string *pdo_mysql_last_insert_id(pdo_dbh_t *dbh, const zend_string * { pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data; PDO_DBG_ENTER("pdo_mysql_last_insert_id"); - PDO_DBG_RETURN(zend_i64_to_str(mysql_insert_id(H->server))); + PDO_DBG_RETURN(zend_u64_to_str(mysql_insert_id(H->server))); } /* }}} */ diff --git a/ext/pdo_mysql/tests/bug80908.phpt b/ext/pdo_mysql/tests/bug80908.phpt new file mode 100644 index 0000000000000..35cba1f89101d --- /dev/null +++ b/ext/pdo_mysql/tests/bug80908.phpt @@ -0,0 +1,49 @@ +--TEST-- +Bug #80908: pdo_mysql lastInsertId() return wrong, when table id bigger than the maximum value of int64 +--SKIPIF-- + +--FILE-- +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); + return $db; +} + +$db = createDB(); +$db->exec('DROP TABLE IF EXISTS test'); +$db->exec('CREATE TABLE test (`id` bigint(20) unsigned AUTO_INCREMENT, `name` varchar(5), primary key (`id`)) ENGINE = InnoDB AUTO_INCREMENT=10376293541461622799'); + +function testLastInsertId(PDO $db) { + echo "Running test lastInsertId\n"; + $db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); + try { + $db->exec("insert into test (`name`) values ('bar')"); + $id = $db->lastInsertId(); + echo "Last insert id is " . $id . "\n"; + } catch (PDOException $e) { + echo $e->getMessage()."\n"; + } +} + +testLastInsertId($db); +unset($db); +echo "\n"; + +?> +--CLEAN-- + +--EXPECT-- +Running test lastInsertId +Last insert id is 10376293541461622799