|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2012-12-20 05:25 UTC] sergey at shymko dot net
Description: ------------ PDO triggers warning(s) regardless of the chosen error handling strategy http://php.net/manual/en/pdo.error-handling.php Environment: - mysql Ver 14.14 Distrib 5.5.22, for Linux (x86_64) using EditLine wrapper Test script: --------------- <?php $adapter = new PDO('mysql:host=localhost;db_name=test', 'root', ''); $adapter->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); assert($adapter->getAttribute(PDO::ATTR_ERRMODE) === PDO::ERRMODE_EXCEPTION); $waitTimeout = 1; $adapter->exec("SET @@session.wait_timeout = {$waitTimeout}"); $statement = $adapter->query('SELECT @@session.wait_timeout'); assert($statement->fetchColumn() == $waitTimeout); /** * Ensure 'MySQL server has gone away' conditions are met */ sleep($waitTimeout + 1); $adapter->query('SELECT 1'); Expected result: ---------------- - PDOException with message 'SQLSTATE[HY000]: General error: 2006 MySQL server has gone away' - No warnings (because of the chosen PDO error handling strategy) Actual result: -------------- 1. When connection type is TCP/IP: 1. Warning: PDO::query() [pdo.query]: MySQL server has gone away 2. Warning: PDO::query() [pdo.query]: Error reading result set's header 1'. When connection type is Unix socket: 1. Warning: Error while sending QUERY packet. PID=18586 2. PDOException with message 'SQLSTATE[HY000]: General error: 2006 MySQL server has gone away' PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Tue Dec 02 08:00:01 2025 UTC |
PHP 5.6.5 (cli) (built: Jan 21 2015 17:50:29) Copyright (c) 1997-2014 The PHP Group Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies with Xdebug v2.2.7, Copyright (c) 2002-2015, by Derick Rethans set_error_handler is ignored and has no effect. Also, as others have commented, the PDO exception mode is also ignored. The warning is sent to php://stdout no matter what, even if making sure the PDO instance is destroyed and disconnected. Apparently, the warning is sent to php://stdout during garbage collection. It makes JSONRPC servers and other stuff impossible to use.Similar problem: try { new PDO( "mysql:dbname=test;host=notalocalhost", $user, $pass, [PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT] ); } catch (PDOException $e) { die("msg: ".$e->getMessage()); } Result: Warning: PDO::__construct(): in C:\file.php on line 2 msg: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Nincs ilyen ismert állomás.This bug is a ******* joke I don't understand how something like this is still not fixed in php 7.0.3 This is how i "fixed" it: // Convert NOTICE, WARNING, ... in Exceptions $convert_error_to_exception = function ($level, $message, $file, $line, $context=null){ throw new ErrorException($message, 0, $level, $file, $line); }; set_error_handler($convert_error_to_exception); I convert Warnings in ErrorException which makes them catchable