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
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
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: Thu Nov 21 14:01:29 2024 UTC