Bug #53185 [Com]: PDO_MYSQL constructor, PHP warning w/ Exception error mode

From: Date: Wed, 21 Nov 2018 23:35:09 +0000
Subject: Bug #53185 [Com]: PDO_MYSQL constructor, PHP warning w/ Exception error mode
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-218080@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=53185&edit=1

 ID:                 53185
 Comment by:         robert dot spriggs at soapcreative dot com
 Reported by:        alexc223 at googlemail dot com
 Summary:            PDO_MYSQL constructor, PHP warning w/ Exception
                     error mode
 Status:             Open
 Type:               Bug
 Package:            PDO MySQL
 Operating System:   Linux
 PHP Version:        5.3.3
 Block user comment: N
 Private report:     N

 New Comment:

This issue is present in PHP 7.1 and PHP 7.2.

It can be caught by a Global Exception handler, however there is no way clear way to distinguish
between a code error and "MySQL has gone away" or similar.


Previous Comments:
------------------------------------------------------------------------
[2015-02-03 17:26:37] tom dot castleman at b3-it dot com

This error is present in 5.6.4.

PDO::__construct emits an E_WARNING despite passing PDO::ATTR_ERRMODE option to it:

$pdo = new PDO('mysql:host=foo;dbname=bar', 'user', 'pass',
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);

Expected Result:
----------------
PDOException - MySQL server has gone away

Actual Result:
--------------
E_WARNING: PDO::__construct(): MySQL server has gone away

------------------------------------------------------------------------
[2014-12-15 10:28:35] s dot adrichem at daisycon dot com

In php 5.3.23 this did not happen upon disconnects and such, eventough we never set the mode, now
though in PHP 5.6.3 it does happen even if we change the modes, with the following simple code.

	$sHostName = "";
	$sUserName = "";
	$sPassword = "";
	$sDefaultDb = "";
	$sTestQuery = " SELECT NOW()";

	$iPort = 3306;
	

	$oDb = new PDO(
		'mysql:host='.$sHostName.';port=' . $iPort,
		$sUserName,
		$sPassword
	);
	$oDb->setAttribute(
		PDO::ATTR_ERRMODE, 
		PDO::ERRMODE_EXCEPTION
	);
	var_dump($oDb->getAttribute(PDO::ATTR_ERRMODE) === PDO::ERRMODE_EXCEPTION);
	$sQuery = "SET WAIT_TIMEOUT = 1";
	$oResult = $oDb->prepare( $sQuery );
	$oResult->execute();
	$sQuery = "use " . $sDefaultDb;
	$oResult = $oDb->prepare( $sQuery );
	$oResult->execute();

	sleep(3);

	$oResult = $oDb->prepare( $sTestQuery );
	$oResult->execute();

	while ($aRow = $oResult->fetch( PDO::FETCH_ASSOC ))
	{
		var_dump($aRow);
	}

I get the following warnings: 
Warning: PDOStatement::execute(): MySQL server has gone away in pdotest.php on line 31
Warning: PDOStatement::execute(): Error reading result set's header in pdotest.php on line 31

And then the expected exception
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General
error: 2006 MySQL server has gone away' in pdotest.php on line 31


Same goes for silent mode, so whats the point of these modes then ;)

------------------------------------------------------------------------
[2012-06-24 10:15:44] pineain at gmail dot com

Same problem on Windows 7 x64

------------------------------------------------------------------------
[2012-05-15 11:37:54] jach at wayf dot dk

Same error on OSX version 3.5.10

------------------------------------------------------------------------
[2010-12-22 17:19:46] alexc223 at googlemail dot com

Maybe there needs to be a way for it to know? Either way, it's highly annoying 
since there is very little ways to handle it.

------------------------------------------------------------------------


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    https://bugs.php.net/bug.php?id=53185


--
Edit this bug report at https://bugs.php.net/bug.php?id=53185&edit=1


Thread (10 messages)

« previous php.bugs (#218080) next »