ID:               44454
 Updated by:       j...@php.net
 Reported By:      mfisc...@php.net
-Status:           Open
+Status:           Verified
 Bug Type:         PDO related
 Operating System: *
 PHP Version:      5.*, 6CVS (2009-04-25)


Previous Comments:
------------------------------------------------------------------------

[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


------------------------------------------------------------------------

[2008-07-03 16:37:49] u...@php.net

No comment on the cause just some observations. Issue exists with
SQLite as well. 

PHP 5.3 CVS

MySQL results:

 emulated prepared statements - not using traversable - OK
 emulated prepared statement  -     using traversable - Issue exists
 
 native prepared statements   - not using traversable - OK
 native prepared statements   -     using traversable - OK

SQLite:

 emulated prepared statements - not using traversable - Issue exists
 emulated prepared statement  -     using traversable - Issue exists



"not using traversable":

$stmt = $db->query('SELECT a, b FROM test');
while ($row = $stmt->fetch()) {
  try {
    $db->exec('INSERT INTO test(a, b) VALUES (1, 1)');
  } catch (Exception $e) {
    printf("while loop\n");
  }
}


"using traversable":

$stmt = $db->query('SELECT a, b FROM test');
foreach ($stmt as $row) {
  try {
   $db->exec('INSERT INTO test(a, b) VALUES (1, 1)');
  } catch (Exception $e) {
    printf("foreach\n");
  }
}  

------------------------------------------------------------------------

[2008-03-17 14:11:44] mfisc...@php.net

Description:
------------
I'm using the SQL SELECT result of an PDO query directly in an
foreach() loop (via it's iterator capability).

Within this loop I'm doing INSERTs and they violate integrity
constraints and thus PDO throws an exception.

I'm catching and basically suppressing the exception. However when the
foreach() loop is finished, an exception gets thrown with the line where
the foreach() statement is declared.

It seems internally the thrown but silently ignored exception has
queued and suddenly being let loose when the foreach() loop finishes.

It doesn't matter whether the SELECT-statement fetches the data from
the table where it is inserted or not, this is just done to make the
example simpler.

I've also tested with php5.3-win32-200803170030 and it's the same
behavior.

It seems to be an similar issue like #39345, but in my case I'm using
the mysql driver and the exception is within my PHP source.

Reproduce code:
---------------
<?php
    $oPdo = new PDO('mysql:host=db01;dbname=test', 'test', 'test');
    $oPdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $oPdo->query('DROP TABLE IF EXISTS test');
    $sSqlCreate = <<<SQL
CREATE TABLE `test` (
  `a` bigint(20) unsigned NOT NULL,
  `b` bigint(20) unsigned NOT NULL,
  UNIQUE KEY `unique_ref` (`a`,`b`)
) ENGINE=MyISAM;
SQL;

    $oPdo->query($sSqlCreate);
    $oPdo->query('TRUNCATE test');
    $oPdo->query('INSERT INTO test(a, b) VALUES(1, 1)');

    $oResult = $oPdo->query('SELECT * FROM test');
    foreach ($oResult as $aRow) {
        try {
            $oPdo->query('INSERT INTO test(a, b) VALUES(1, 1)');
        } catch (Exception $e) { }
    }
?>


Expected result:
----------------
Don't throw an exception:

$ php reproduce_pdo_bug.php
# 0
# 1
$

Actual result:
--------------
$ php reproduce_pdo_bug.php
# 0
# 1

PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062
Duplicate entry '1-1' for key 1 in reproduce_pdo_bug.php on line 20

Call Stack:
    0.0002      58460   1. {main}() reproduce_pdo_bug.php:0



------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=44454&edit=1

Reply via email to