Skip to content
Closed
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion ext/pdo/pdo_stmt.c
Original file line number Diff line number Diff line change
Expand Up @@ -771,9 +771,10 @@ static bool do_fetch(pdo_stmt_t *stmt, zval *return_value, enum pdo_fetch_type h
pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "No fetch class specified");
goto in_fetch_error;
}
ctor_arguments = stmt->fetch.cls.ctor_args;
}
ZEND_ASSERT(ce != NULL);

ctor_arguments = stmt->fetch.cls.ctor_args;
if (flags & PDO_FETCH_SERIALIZE) {
if (!ce->unserialize) {
/* As this option is deprecated we do not bother to mention the class name. */
Expand Down
97 changes: 97 additions & 0 deletions ext/pdo/tests/gh20553.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
--TEST--
GH-20553: PHP 8.5.0 regression: PDO::FETCH_CLASSTYPE ignores $constructorArgs
--EXTENSIONS--
pdo
--SKIPIF--
<?php
$dir = getenv('REDIR_TEST_DIR');
if (false == $dir) die('skip no driver');
if (str_starts_with(getenv('PDOTEST_DSN'), "firebird")) {
die("skip firebird doesn't support non-standard SQL without FROM syntax");
}
require_once $dir . 'pdo_test.inc';
PDOTest::skip();
?>
--FILE--
<?php

if (getenv('REDIR_TEST_DIR') === false) putenv('REDIR_TEST_DIR='.__DIR__ . '/../../pdo/tests/');
require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
$db = PDOTest::factory();

class dumpy {
function __construct() {
echo 'constructor called,' . PHP_EOL . ' my class is ' .
var_export(get_class($this), true) . PHP_EOL .
' input parameters: ' .
var_export(func_get_args(), true) . PHP_EOL;
}
function __set($name, $value) {
echo var_export($name, true) . ' = ' . var_export($value, true) .
PHP_EOL;
}
}
class dummy extends dumpy {
}

$sql = "SELECT 'dummy' pdo_fetch_class_type_class, 'bar' foo, 'dfg' abc";

$fetchModes = [
'PDO::FETCH_CLASS'
=> PDO::FETCH_CLASS,
'PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE'
=> PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE,
'PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE'
=> PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE,
'PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE | PDO::FETCH_PROPS_LATE'
=> PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE | PDO::FETCH_PROPS_LATE,
];

foreach ($fetchModes as $combinedModes => $fetchMode) {
echo '## ' . $combinedModes . PHP_EOL;
$db->query($sql)->fetchAll(
$fetchMode,
'dumpy',
['constructor argument #1']
);
echo PHP_EOL;
}
?>
--EXPECT--
## PDO::FETCH_CLASS
'pdo_fetch_class_type_class' = 'dummy'
'foo' = 'bar'
'abc' = 'dfg'
constructor called,
my class is 'dumpy'
input parameters: array (
0 => 'constructor argument #1',
)

## PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE
constructor called,
my class is 'dumpy'
input parameters: array (
0 => 'constructor argument #1',
)
'pdo_fetch_class_type_class' = 'dummy'
'foo' = 'bar'
'abc' = 'dfg'

## PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE
'foo' = 'bar'
'abc' = 'dfg'
constructor called,
my class is 'dummy'
input parameters: array (
0 => 'constructor argument #1',
)

## PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE | PDO::FETCH_PROPS_LATE
constructor called,
my class is 'dummy'
input parameters: array (
0 => 'constructor argument #1',
)
'foo' = 'bar'
'abc' = 'dfg'
Loading