Edit report at http://bugs.php.net/bug.php?id=44454&edit=1
ID: 44454 Comment by: rgagnon24 at gmail dot com Reported by: mfisc...@php.net Summary: Unexpected exception thrown in foreach() statement Status: Verified Type: Bug Package: PDO related Operating System: * PHP Version: 5.*, 6CVS (2009-04-25) New Comment: Looking at pdo_mysql extension source code, I see the exception is actually being raised twice, not being buffered. from php5.2.13 source, file ext/pdo_mysql/mysql_statement.c is calling _pdo_mysql_error() in two places. Once from line 218 in pdo_mysql_stmt_execute() after mysql_real_query() fails, and then again at line 425 in pdo_mysql_stmt_fetch() because mysql_errno() indicates there is an error. Previous Comments: ------------------------------------------------------------------------ [2010-05-08 06:08:33] gregory at tiv dot net Correction: ----------- if ( $conn->errorCode() ) { should be if ( $conn->errorCode() !== '00000' ) { ------------------------------------------------------------------------ [2010-05-07 02:13:48] gregory at tiv dot net I have a simpler test case, one solution/explanation and one workaround. Tested under: Windows - PHP 5.2.13 (cli) (built: Feb 24 2010 14:32:32) FreeBSD - PHP 5.2.12 with Suhosin-Patch 0.9.7 (cli) (built: Feb 24 2010 23:12:45) Demonstration code: ------------------- <?php # # PDO foreach exception bug # Demonstration code # Author: Gregory Karpinsky, http://www.tiv.net # 2010-05-06 print '<p>This code works OK (Exception is cleaned artificially)</p>'; $conn = new PDO( 'mysql:host=localhost', 'test', 'test' ); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $oRS = $conn->query( "select 'OK'" ); foreach ( $oRS as $row ) { try { $conn->query( 'Bogus SQL' ); } catch (PDOException $e) {} if ( $conn->errorCode() ) { $conn->query( "select 'CLEAN_PDO_ERROR'" ); } print '<p>NO exception will be thrown.</p>'; } print '<p>This code works OK (two separate connections)</p>'; $conn = new PDO( 'mysql:host=localhost', 'test', 'test' ); $conn2 = new PDO( 'mysql:host=localhost', 'test', 'test' ); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $conn2->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $oRS = $conn->query( "select 'OK'" ); foreach ( $oRS as $row ) { try { $conn2->query( 'Bogus SQL' ); } catch (PDOException $e) {} print '<p>NO exception will be thrown.</p>'; } print '<p>This code throws unexpected exception in foreach</p>'; $conn = new PDO( 'mysql:host=localhost', 'test', 'test' ); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $oRS = $conn->query( "select 'OK'" ); foreach ( $oRS as $row ) { try { $conn->query( 'Bogus SQL' ); } catch (PDOException $e) {} print '<p>Exception will be thrown after this...</p>'; } ?> ------------------------------------------------------------------------ [2009-04-25 17:16:14] mfisc...@php.net Using Windows snapshots, verified that the bug still exists in 5.2.10-dev and 5.3.0RC2-dev . Cannot test with 6.0.0-dev, the php.exe doesn't even properly start. ------------------------------------------------------------------------ [2009-04-25 14:57:23] j...@php.net Does this still exist? If so, update the version properly.. ;) ------------------------------------------------------------------------ [2008-07-03 16:44:39] u...@php.net Correction: emulated prepared statements - not using traversable - Issue exists emulated prepared statement - using traversable - Issue exists ------------------------------------------------------------------------ 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 http://bugs.php.net/bug.php?id=44454 -- Edit this bug report at http://bugs.php.net/bug.php?id=44454&edit=1