1--TEST-- 2Bug #44454 (Unexpected exception thrown in foreach() statement) 3--SKIPIF-- 4<?php 5if (!extension_loaded('pdo') || !extension_loaded('pdo_mysql')) die('skip not loaded'); 6require dirname(__FILE__) . '/config.inc'; 7require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc'; 8PDOTest::skip(); 9?> 10--FILE-- 11<?php 12require dirname(__FILE__) . '/config.inc'; 13require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc'; 14$db = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt'); 15 16function bug_44454($db) { 17 18 try { 19 20 $db->exec('DROP TABLE IF EXISTS test'); 21 $db->exec('CREATE TABLE test(a INT, b INT, UNIQUE KEY idx_ab (a, b))'); 22 $db->exec('INSERT INTO test(a, b) VALUES (1, 1)'); 23 24 $stmt = $db->query('SELECT a, b FROM test'); 25 printf("... SELECT has returned %d row...\n", $stmt->rowCount()); 26 while ($row = $stmt->fetch()) { 27 try { 28 printf("... INSERT should fail...\n"); 29 $db->exec('INSERT INTO test(a, b) VALUES (1, 1)'); 30 } catch (Exception $e) { 31 printf("... STMT - %s\n", var_export($stmt->errorCode(), true)); 32 printf("... PDO - %s\n", var_export($db->errorInfo(), true)); 33 } 34 } 35 36 $db->exec('DROP TABLE IF EXISTS test'); 37 $db->exec('CREATE TABLE test(a INT, b INT, UNIQUE KEY idx_ab (a, b))'); 38 $db->exec('INSERT INTO test(a, b) VALUES (1, 1)'); 39 40 } catch (Exception $e) { 41 printf("... While error %s\n", $e->getMessage()); ; 42 } 43 44 $stmt = $db->query('SELECT a, b FROM test'); 45 printf("... SELECT has returned %d row...\n", $stmt->rowCount()); 46 foreach ($stmt as $row) { 47 try { 48 printf("... INSERT should fail...\n"); 49 $db->exec('INSERT INTO test(a, b) VALUES (1, 1)'); 50 } catch (Exception $e) { 51 printf("... STMT - %s\n", var_export($stmt->errorCode(), true)); 52 printf("... PDO - %s\n", var_export($db->errorInfo(), true)); 53 } 54 } 55 56} 57 58$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 59 60print "Native Prepared Statements\n"; 61$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0); 62bug_44454($db); 63 64print "\nEmulated Prepared Statements\n"; 65$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1); 66bug_44454($db); 67 68print "done!"; 69?> 70--CLEAN-- 71<?php 72require dirname(__FILE__) . '/mysql_pdo_test.inc'; 73$db = MySQLPDOTest::factory(); 74$db->exec('DROP TABLE IF EXISTS test'); 75?> 76--XFAIL-- 77For some reason the exception gets thrown at the wrong place 78--EXPECTF-- 79Native Prepared Statements 80... SELECT has returned 1 row... 81... INSERT should fail... 82... STMT - '00000' 83... PDO - array ( 84 0 => '23000', 85 1 => 1062, 86 2 => 'Duplicate entry \'1-1\' for key %s', 87) 88... SELECT has returned 1 row... 89... INSERT should fail... 90... STMT - '00000' 91... PDO - array ( 92 0 => '23000', 93 1 => 1062, 94 2 => 'Duplicate entry \'1-1\' for key %s', 95) 96 97Emulated Prepared Statements 98... SELECT has returned 1 row... 99... INSERT should fail... 100... STMT - '00000' 101... PDO - array ( 102 0 => '23000', 103 1 => 1062, 104 2 => 'Duplicate entry \'1-1\' for key %s', 105) 106... SELECT has returned 1 row... 107... INSERT should fail... 108... STMT - '00000' 109... PDO - array ( 110 0 => '23000', 111 1 => 1062, 112 2 => 'Duplicate entry \'1-1\' for key %s', 113) 114done! 115