pdo_014.phpt 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. --TEST--
  2. PDO Common: PDOStatement SPL iterator
  3. --EXTENSIONS--
  4. pdo
  5. --SKIPIF--
  6. <?php
  7. $dir = getenv('REDIR_TEST_DIR');
  8. if (false == $dir) die('skip no driver');
  9. require_once $dir . 'pdo_test.inc';
  10. PDOTest::skip();
  11. ?>
  12. --FILE--
  13. <?php
  14. if (getenv('REDIR_TEST_DIR') === false) putenv('REDIR_TEST_DIR='.__DIR__ . '/../../pdo/tests/');
  15. require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
  16. $db = PDOTest::factory();
  17. $db->exec('CREATE TABLE test(id int NOT NULL PRIMARY KEY, val VARCHAR(10), grp VARCHAR(10))');
  18. $db->exec('INSERT INTO test VALUES(1, \'A\', \'Group1\')');
  19. $db->exec('INSERT INTO test VALUES(2, \'B\', \'Group2\')');
  20. $SELECT = 'SELECT val, grp FROM test';
  21. class Test
  22. {
  23. function __construct($name = 'N/A')
  24. {
  25. echo __METHOD__ . "($name)\n";
  26. }
  27. }
  28. $stmt = $db->query($SELECT, PDO::FETCH_CLASS, 'Test', array('WOW'));
  29. $it = new IteratorIterator($stmt); /* check if we can convert that thing */
  30. /*** HINT: If YOU plan to do so remember not to call rewind() -> see below ***/
  31. foreach($it as $data)
  32. {
  33. var_dump($data);
  34. }
  35. $it->next(); /* must be allowed */
  36. var_dump($it->current()); /* must return NULL */
  37. var_dump($it->valid()); /* must return false */
  38. class PDOStatementAggregate extends PDOStatement implements IteratorAggregate
  39. {
  40. private function __construct()
  41. {
  42. echo __METHOD__ . "\n";
  43. $this->setFetchMode(PDO::FETCH_NUM);
  44. /* default fetch mode is BOTH, so we see if the ctor can overwrite that */
  45. }
  46. function getIterator(): Iterator
  47. {
  48. echo __METHOD__ . "\n";
  49. $this->execute();
  50. return new IteratorIterator($this, 'PDOStatement');
  51. }
  52. }
  53. $stmt = $db->prepare($SELECT, array(PDO::ATTR_STATEMENT_CLASS=>array('PDOStatementAggregate')));
  54. foreach($stmt as $data)
  55. {
  56. var_dump($data);
  57. }
  58. ?>
  59. --EXPECTF--
  60. Test::__construct(WOW)
  61. object(Test)#%d (2) {
  62. ["val"]=>
  63. string(1) "A"
  64. ["grp"]=>
  65. string(6) "Group1"
  66. }
  67. Test::__construct(WOW)
  68. object(Test)#%d (2) {
  69. ["val"]=>
  70. string(1) "B"
  71. ["grp"]=>
  72. string(6) "Group2"
  73. }
  74. NULL
  75. bool(false)
  76. PDOStatementAggregate::__construct
  77. PDOStatementAggregate::getIterator
  78. array(2) {
  79. [0]=>
  80. string(1) "A"
  81. [1]=>
  82. string(6) "Group1"
  83. }
  84. array(2) {
  85. [0]=>
  86. string(1) "B"
  87. [1]=>
  88. string(6) "Group2"
  89. }