bug_44454.phpt 2.9 KB

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