Bug #80458 [Opn->Csd]: PDOStatement::fetchAll() throws for upsert queries
Edit report at https://bugs.php.net/bug.php?id=80458&edit=1
ID: 80458
Updated by: nikic@php.net
Reported by: php dot net dot 20 dot 12 dot 2016 at 0pe dot de
Summary: PDOStatement::fetchAll() throws for upsert queries
-Status: Open
+Status: Closed
Type: Bug
Package: PDO MySQL
Operating System: Arch Linux
PHP Version: 7.4.13
Block user comment: N
Private report: N
New Comment:
Automatic comment on behalf of tekiela246@gmail.com
Revision: http://git.php.net/?p=php-src.git;a=commit;h=a83cc03c138b8cf27a840bd7cd913eb7050e55ba
Log: Fixed bug #80458
Previous Comments:
------------------------------------------------------------------------
[2020-12-02 22:57:09] cmb@php.net
The following pull request has been associated:
Patch Name: Bug #80458 PDOStatement::fetchAll() throws for upsert queries
On GitHub: https://github.com/php/php-src/pull/6482
Patch: https://github.com/php/php-src/pull/6482.patch
------------------------------------------------------------------------
[2020-12-02 15:54:05] nikic@php.net
Related To: Bug #80472
------------------------------------------------------------------------
[2020-12-01 19:06:29] php dot net dot 20 dot 12 dot 2016 at 0pe dot de
Description:
------------
Using PDOStatement::fetch() or PDOStatement::fetachAll() after a query without resulting data
(INSERT, DELETE and so on) results in throw of PDOException.
2 problems:
1.: Before PHP 7.4.13 fetch(All) returned false. Throwing an exception here seems wrong to me.
2.: Exception text is misleading. It says that there are other unbuffered queries even when there
are no queries made before.
Exception text: "Uncaught PDOException: SQLSTATE[HY000]: General error: 2014 Cannot execute
queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll().
Alternatively, if your code is only ever going to run against mysql, you may enable query buffering
by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute"
Test script:
---------------
error_reporting(E_ALL);
ini_set('display_errors', '1');
// Connect
$pdoLink = new PDO("mysql:dbname=test;host=localhost;charset=UTF8", 'root',
'root');
$pdoLink->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL);
$pdoLink->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdoLink->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_NATURAL);
$pdoLink->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$pdoLink->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
$pdoLink->setAttribute(PDO::ATTR_AUTOCOMMIT, true);
$pdoLink->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
// Query
$stmt = 'INSERT INTO pdotest_user (username) VALUES
(:username)';
$pdoStmt = $pdoLink->prepare($stmt);
$pdoStmt->execute([':username' => 'Testman']);
// Result
$resArr = [];
while (($row = $pdoStmt->fetch(PDO::FETCH_ASSOC)) !== false) // Exception thrown here
$resArr[] = $row;
// Cleanup
$pdoStmt->closeCursor();
print_r($resArr);
Expected result:
----------------
fetch/fetchAll should return false if there is no data for the query
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=80458&edit=1
Thread (3 messages)