|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2010-10-27 17:17 UTC] alexc223 at googlemail dot com
Description:
------------
A PHP warning is generated even though I've explicitly set the PDO error mode to
use exceptions. This warning occurs when the MySQL socket does not exist (for
example, if MySQL is not yet started).
This makes it quite impossible to handle.
Test script:
---------------
<?php
try {
$pdo = new Pdo( 'mysql:host=localhost;dbname=test', 'user', 'pass', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION) );
} catch ( PDOException $e ) {
echo 'unable to connect';
}
?>
Expected result:
----------------
unable to connect
Actual result:
--------------
Warning: PDO::__construct(): [2002] No such file or directory (trying to connect
via unix:///var/run/mysqld/mysqld.sock) in php shell code on line 2
unable to connect
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 17:00:01 2025 UTC |
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 ;)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