bug_44454.phpt 3.0 KB

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