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