|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2018-11-20 14:59 UTC] morozov at tut dot by
Description:
------------
According to the documentation PDOStatement::closeCursor() […] leaves the statement in a state that enables it to be executed again. The example below works at least with pdo_mysql, pdo_sqlite and pdo_pgsql but doesn't work with pdo_oci.
Test script:
---------------
$conn = new PDO(
'oci:dbname=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SID=XE)))',
'system',
'oracle'
);
$stmt = $conn->prepare('SELECT ? FROM DUAL');
$stmt->execute([1]);
$value = $stmt->fetchColumn();
var_dump($value);
$stmt->closeCursor();
$stmt->execute([2]);
$value = $stmt->fetchColumn();
var_dump($value);
Expected result:
----------------
string(1) "1"
string(1) "2"
Actual result:
--------------
string(1) "1"
NULL
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sun Oct 26 22:00:01 2025 UTC |
When testing on PHP 7.2.12, the PDO statement columns remaining set after closing the cursor seems to cause the issue. If instead closeCursor were to remove the stmt->columns (though this is probably incorrect to do), the result becomes correct because PDOStatement::execute gets past: if (stmt->dbh->alloc_own_columns && !stmt->columns) { so that pdo_stmt_describe_columns can be called, which will then populate the column and return 2.