Bug #73878 [Com]: PDOStatement::execute() throws a warning when ATTR_ERRMODE = ERRMODE_EXCEPTION

From: Date: Mon, 19 Nov 2018 16:25:50 +0000
Subject: Bug #73878 [Com]: PDOStatement::execute() throws a warning when ATTR_ERRMODE = ERRMODE_EXCEPTION
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-218048@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=73878&edit=1 ID: 73878 Comment by: bburnichon+php dot net at gmail dot com Reported by: alexander at dobrolyubov dot com Summary: PDOStatement::execute() throws a warning when ATTR_ERRMODE = ERRMODE_EXCEPTION Status: Open Type: Bug Package: PDO MySQL Operating System: Linux PHP Version: 7.1.0 Block user comment: N Private report: N New Comment: Actually, the error can be drilled down to mysqlnd driver which trigger warnings on its own. I think mysqlnd should have a configuration to avoid triggering warnings in these cases. Error is already saved in error_info from what I understand from the code. In mysqlnd_wireprotocol.c for example: ```C /* {{{ mysqlnd_read_packet_header_and_body */ static enum_func_status mysqlnd_read_packet_header_and_body(MYSQLND_PACKET_HEADER * packet_header, MYSQLND_PFC * pfc, MYSQLND_VIO * vio, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info, MYSQLND_CONNECTION_STATE * connection_state, zend_uchar * buf, size_t buf_size, const char * const packet_type_as_text, enum mysqlnd_packet_type packet_type) { DBG_ENTER("mysqlnd_read_packet_header_and_body"); DBG_INF_FMT("buf=%p size=%u", buf, buf_size); if (FAIL == mysqlnd_read_header(pfc, vio, packet_header, stats, error_info)) { SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT); SET_CLIENT_ERROR(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone); php_error_docref(NULL, E_WARNING, "%s", mysqlnd_server_gone); DBG_ERR_FMT("Can't read %s's header", packet_type_as_text); DBG_RETURN(FAIL); } /* 8<---------------- Snipped */ } ``` Previous Comments: ------------------------------------------------------------------------ [2017-01-06 07:17:10] alexander at dobrolyubov dot com Description: ------------ In php 7.1 the mysqlnd driver generates a warning "2006 MySQL server has gone away", but it should not as PDO::ATTR_ERRMODE set to PDO::ERRMODE_EXCEPTION Test script: --------------- <?php $dbh = new PDO('mysql:dbname=testdb;host=localhost', 'testuser', 'testpwd'); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT); $dbh->exec('SET session wait_timeout=1'); sleep(2); $stmt = $dbh->prepare('DO 1'); $stmt->execute(); Expected result: ---------------- Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away in /home/dag/src/php-7.1.0/test.php:12 Stack trace: #0 /home/dag/src/php-7.1.0/test.php(12): PDOStatement->execute() #1 {main} thrown in /home/dag/src/php-7.1.0/test.php on line 12 Actual result: -------------- Warning: PDOStatement::execute(): MySQL server has gone away in /home/dag/src/php-7.1.0/test.php on line 12 Warning: PDOStatement::execute(): Error reading result set's header in /home/dag/src/php-7.1.0/test.php on line 12 Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away in /home/dag/src/php-7.1.0/test.php:12 Stack trace: #0 /home/dag/src/php-7.1.0/test.php(12): PDOStatement->execute() #1 {main} thrown in /home/dag/src/php-7.1.0/test.php on line 12 ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=73878&edit=1

« previous php.bugs (#218048) next »