Edit report at http://bugs.php.net/bug.php?id=44454&edit=1
ID: 44454
Comment by: rgagnon24 at gmail dot com
Reported by: mfischer@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] mfischer@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] jani@php.net
Does this still exist? If so, update the version properly.. ;)
------------------------------------------------------------------------
[2008-07-03 16:44:39] uw@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