php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #74401 PDO trigger warning already set throw exception
Submitted: 2017-04-10 09:39 UTC Modified: 2017-04-11 15:04 UTC
Votes:3
Avg. Score:3.7 ± 0.9
Reproduced:3 of 3 (100.0%)
Same Version:2 (66.7%)
Same OS:1 (33.3%)
From: lusc at jiedaibao dot com Assigned:
Status: Open Package: PDO MySQL
PHP Version: 7.0.17 OS: Centos6.x
Private report: No CVE-ID: None
Have you experienced this issue?
Rate the importance of this bug to you:

 [2017-04-10 09:39 UTC] lusc at jiedaibao dot com
Description:
------------
PDOStatement::execute trigger an error when lost connection. I have already set 
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


bug an Warning error is trigger , like:
Warning: PDOStatement::execute: MySQL server has gone away in ...

Expected result:
----------------
just throw exception

Actual result:
--------------
warning and exception all trigger

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2017-04-10 09:52 UTC] danack@php.net
Please can you provide a simple test script that shows this.
 [2017-04-10 09:56 UTC] danack@php.net
-Status: Open +Status: Feedback
 [2017-04-10 09:56 UTC] danack@php.net
Forgot to update the status to feedback. Also, the reason I'm asking for an example is that the code for generating warning or exceptions looks really quite unlikely to do both.

https://github.com/php/php-src/blob/528468579b002ff17e3c38d9330da67749fd85ec/ext/pdo/pdo_dbh.c#L149-L165
 [2017-04-11 15:04 UTC] lusc at jiedaibao dot com
-Status: Feedback +Status: Open
 [2017-04-11 15:04 UTC] lusc at jiedaibao dot com
example:
```
error_reporting(E_ALL);
ini_set('display_errors', 'on');
try {
    $pdo = new PDO('mysql:dbname=qiye;host=100.73.13.5;charset=utf8', 'myroot', 'Hsql1234');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt1 = $pdo->prepare('SELECT * FROM auth limit 1');
    $stmt1->execute();
    var_dump($stmt1->fetchAll());

    sleep('30'); // stop the mysql server at this time

    $stmt1 = $pdo->prepare('SELECT * FROM jdb_company_info limit 1');
    $stmt1->execute();
    var_dump($stmt1->fetchAll());
} catch (Throwable $e) {
    var_dump($e->__toString());
}
```

output:

```
array(0) {
}
Warning: PDOStatement::execute(): MySQL server has gone away in /mnt/g/workspace/workspace/qiye/tests/web/test.php on line 21

Warning: PDOStatement::execute(): Error reading result set's header in /mnt/g/workspace/workspace/qiye/tests/web/test.php on line 21
string(240) "PDOException: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away in /mnt/g/workspace/workspace/qiye/tests/web/test.php:21
Stack trace:
#0 /mnt/g/workspace/workspace/qiye/tests/web/test.php(21): PDOStatement->execute()
#1 {main}"
```
 [2017-04-12 06:45 UTC] lusc at jiedaibao dot com
https://bugs.php.net/bug.php?id=63812 , same problem.
 [2017-04-13 02:50 UTC] lusc at jiedaibao dot com
mysqlnd_result.c line 429
php_error_docref(NULL, E_WARNING, "Error reading result set's header");

mysqlnd_wireprotocol.c 
line 298 and line 310
php_error_docref(NULL, E_WARNING, "%s", mysqlnd_server_gone);
 
PHP Copyright © 2001-2018 The PHP Group
All rights reserved.
Last updated: Sun Nov 18 01:01:26 2018 UTC