php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #65825 PDOStatement::fetch() does not throw exception on broken server connection
Submitted: 2013-10-03 11:15 UTC Modified: 2014-01-01 12:30 UTC
Votes:6
Avg. Score:4.3 ± 0.7
Reproduced:5 of 5 (100.0%)
Same Version:1 (20.0%)
Same OS:0 (0.0%)
From: cf0hay at gmail dot com Assigned:
Status: Closed Package: PDO MySQL
PHP Version: 5.5.4 OS: Hardened Gentoo Linux 64
Private report: No CVE-ID: None
View Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
If you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: cf0hay at gmail dot com
New email:
PHP Version: OS:

 

 [2013-10-03 11:15 UTC] cf0hay at gmail dot com
Description:
------------
Using PDO with mysqlnd driver.

PDO instance was asked to throw exceptions, but calling fetch() after the TCP connection broke does not throw an exception, it just emits a warning instead, "Empty row packet body".

The server is located on a different computer on the network, cannot use unix socket to reach it.

Test script:
---------------
$conn = new PDO(
            'mysql:host=192.168.1.2;dbname=somedb;charset=utf8',
            'somedbuser',
            'somedbpass',
            array(
                PDO::ATTR_PERSISTENT => false,
                PDO::ATTR_EMULATE_PREPARES => false,
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_STRINGIFY_FETCHES => false,
                PDO::ATTR_AUTOCOMMIT => true,
                PDO::MYSQL_ATTR_INIT_COMMAND => "SET time_zone = '+00:00'",
                PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false,
                PDO::MYSQL_ATTR_DIRECT_QUERY => false,
                PDO::MYSQL_ATTR_FOUND_ROWS => false,
            )
        );

        $res = $conn->query("
            any query which gives back a lot of rows
        ");
        while($row = $res->fetch(PDO::FETCH_ASSOC)){
            //during this loop runs, terminate the connection with something, like iptables
            var_export($row);
        }
        var_export($row);


Expected result:
----------------
PDOStatement::fetch() should throw an exception as the server connection has gone away (trying to do a new PDO::query() after does throw an exception with that error message).

Actual result:
--------------
The script above just emits a warning and finishes the loop returning false the very same way as if there were no more rows left from the query.

Patches

Pull Requests

Pull requests:

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2013-10-03 11:35 UTC] cf0hay at gmail dot com
The correct SQLSTATE would be HY000, 2013.
 [2014-01-01 12:30 UTC] felipe@php.net
-Package: PDO related +Package: PDO MySQL
 [2020-10-28 16:19 UTC] nikic@php.net
Automatic comment on behalf of nikita.ppv@gmail.com
Revision: http://git.php.net/?p=php-src.git;a=commit;h=a66d73db4b2e2fcf03b9ecbbc196440eefeb6641
Log: Fixed bug #65825
 [2020-10-28 16:19 UTC] nikic@php.net
-Status: Open +Status: Closed
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sat Nov 23 10:01:28 2024 UTC