. Fixed bug #79084 (mysqlnd may fetch wrong column indexes with MYSQLI_BOTH).
(cmb)
+- PDO:
+ . Fixed bug #79106 (PDO may fetch wrong column indexes with PDO::FETCH_BOTH).
+ (cmb)
+
23 Jan 2020, PHP 7.3.14
- Core
case PDO_FETCH_USE_DEFAULT:
case PDO_FETCH_BOTH:
zend_symtable_update(Z_ARRVAL_P(return_value), stmt->columns[i].name, &val);
- if (Z_REFCOUNTED(val)) {
- Z_ADDREF(val);
+ if (zend_hash_index_add(Z_ARRVAL_P(return_value), i, &val) != NULL) {
+ Z_TRY_ADDREF(val);
}
- zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &val);
break;
case PDO_FETCH_NAMED:
--- /dev/null
+--TEST--
+Bug #79106 (PDO may fetch wrong column indexes with PDO::FETCH_BOTH)
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo')) die('skip pdo extension not available');
+$dir = getenv('REDIR_TEST_DIR');
+if (!$dir) die('skip no driver');
+require_once $dir . 'pdo_test.inc';
+try {
+ $db = PDOTest::factory();
+} catch (PDOException $e) {
+ die('skip ' . $e->getMessage());
+}
+if ($db->query('SELECT 1 as "1"') === false) {
+ die('skip driver does not support quoted numeric identifiers');
+}
+?>
+--FILE--
+<?php
+if (getenv('REDIR_TEST_DIR') === false) putenv('REDIR_TEST_DIR=' . dirname(__FILE__) . '/../../pdo/tests/');
+require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
+$db = PDOTest::factory();
+
+$stmt = $db->query('SELECT 0 as "2007", 0 as "2008", 0 as "2020"');
+var_dump($stmt->fetchAll());
+?>
+--EXPECT--
+array(1) {
+ [0]=>
+ array(6) {
+ [2007]=>
+ string(1) "0"
+ [0]=>
+ string(1) "0"
+ [2008]=>
+ string(1) "0"
+ [1]=>
+ string(1) "0"
+ [2020]=>
+ string(1) "0"
+ [2]=>
+ string(1) "0"
+ }
+}
--- /dev/null
+--TEST--
+Bug #79106 (PDO may fetch wrong column indexes with PDO::FETCH_BOTH) - collision
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo')) die('skip pdo extension not available');
+$dir = getenv('REDIR_TEST_DIR');
+if (!$dir) die('skip no driver');
+require_once $dir . 'pdo_test.inc';
+try {
+ $db = PDOTest::factory();
+} catch (PDOException $e) {
+ die('skip ' . $e->getMessage());
+}
+if ($db->query('SELECT 1 as "1"') === false) {
+ die('skip driver does not support quoted numeric identifiers');
+}
+?>
+--FILE--
+<?php
+if (getenv('REDIR_TEST_DIR') === false) putenv('REDIR_TEST_DIR=' . dirname(__FILE__) . '/../../pdo/tests/');
+require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
+$db = PDOTest::factory();
+
+$stmt = $db->query('SELECT 11111 as "1", 22222 as "2"');
+var_dump($stmt->fetchAll());
+?>
+--EXPECT--
+array(1) {
+ [0]=>
+ array(3) {
+ [1]=>
+ string(5) "11111"
+ [0]=>
+ string(5) "11111"
+ [2]=>
+ string(5) "22222"
+ }
+}
array(2) {
[1]=>
int(1)
- [2]=>
+ [0]=>
int(1)
}
done!
print "done!";
?>
--EXPECT--
-[002] Suspicious FETCH_BOTH result, dumping
-array(2) {
- [0]=>
- string(1) "1"
- [1]=>
- string(1) "1"
-}
-array(2) {
- [1]=>
- string(1) "1"
- [2]=>
- string(1) "1"
-}
-[002] Expected differes from returned data, dumping
-array(2) {
- [0]=>
- string(1) "1"
- [1]=>
- string(1) "1"
-}
-array(2) {
- [1]=>
- string(1) "1"
- [2]=>
- string(1) "1"
-}
done!