xref: /PHP-8.0/ext/pdo/tests/pdo_011.phpt (revision f8d79582)
1--TEST--
2PDO Common: PDO::FETCH_FUNC and statement overloading
3--SKIPIF--
4<?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='.__DIR__ . '/../../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\', \'Group1\')');
20$db->exec('INSERT INTO test VALUES(3, \'C\', \'Group2\')');
21$db->exec('INSERT INTO test VALUES(4, \'D\', \'Group2\')');
22
23class DerivedStatement extends PDOStatement
24{
25    private function __construct($name, $db)
26    {
27        $this->name = $name;
28        echo __METHOD__ . "($name)\n";
29    }
30
31    function reTrieve($id, $val) {
32        echo __METHOD__ . "($id,$val)\n";
33        return array($id=>$val);
34    }
35}
36
37$select1 = $db->prepare('SELECT grp, id FROM test');
38$select2 = $db->prepare('SELECT id, val FROM test');
39$derived = $db->prepare('SELECT id, val FROM test', array(PDO::ATTR_STATEMENT_CLASS=>array('DerivedStatement', array('Overloaded', $db))));
40
41class Test1
42{
43    public function __construct($id, $val)
44    {
45        echo __METHOD__ . "($id,$val)\n";
46        $this->id = $id;
47        $this->val = $val;
48    }
49
50    static public function factory($id, $val)
51    {
52        echo __METHOD__ . "($id,$val)\n";
53        return new self($id, $val);
54    }
55}
56
57function test($id,$val='N/A')
58{
59    echo __METHOD__ . "($id,$val)\n";
60    return array($id=>$val);
61}
62
63$f = new Test1(0,0);
64
65$select1->execute();
66var_dump($select1->fetchAll(PDO::FETCH_FUNC|PDO::FETCH_GROUP, 'test'));
67
68$select2->execute();
69var_dump($select2->fetchAll(PDO::FETCH_FUNC, 'test'));
70
71$select2->execute();
72var_dump($select2->fetchAll(PDO::FETCH_FUNC, array('Test1','factory')));
73
74$select2->execute();
75var_dump($select2->fetchAll(PDO::FETCH_FUNC, array($f, 'factory')));
76
77var_dump(get_class($derived));
78$derived->execute();
79var_dump($derived->fetchAll(PDO::FETCH_FUNC, array($derived, 'retrieve')));
80$derived->execute();
81var_dump($derived->fetchAll(PDO::FETCH_FUNC, array($derived, 'reTrieve')));
82$derived->execute();
83var_dump($derived->fetchAll(PDO::FETCH_FUNC, array($derived, 'RETRIEVE')));
84
85?>
86--EXPECTF--
87DerivedStatement::__construct(Overloaded)
88Test1::__construct(0,0)
89test(1,N/A)
90test(2,N/A)
91test(3,N/A)
92test(4,N/A)
93array(2) {
94  ["Group1"]=>
95  array(2) {
96    [0]=>
97    array(1) {
98      [1]=>
99      string(3) "N/A"
100    }
101    [1]=>
102    array(1) {
103      [2]=>
104      string(3) "N/A"
105    }
106  }
107  ["Group2"]=>
108  array(2) {
109    [0]=>
110    array(1) {
111      [3]=>
112      string(3) "N/A"
113    }
114    [1]=>
115    array(1) {
116      [4]=>
117      string(3) "N/A"
118    }
119  }
120}
121test(1,A)
122test(2,B)
123test(3,C)
124test(4,D)
125array(4) {
126  [0]=>
127  array(1) {
128    [1]=>
129    string(1) "A"
130  }
131  [1]=>
132  array(1) {
133    [2]=>
134    string(1) "B"
135  }
136  [2]=>
137  array(1) {
138    [3]=>
139    string(1) "C"
140  }
141  [3]=>
142  array(1) {
143    [4]=>
144    string(1) "D"
145  }
146}
147Test1::factory(1,A)
148Test1::__construct(1,A)
149Test1::factory(2,B)
150Test1::__construct(2,B)
151Test1::factory(3,C)
152Test1::__construct(3,C)
153Test1::factory(4,D)
154Test1::__construct(4,D)
155array(4) {
156  [0]=>
157  object(Test1)#%d (2) {
158    ["id"]=>
159    string(1) "1"
160    ["val"]=>
161    string(1) "A"
162  }
163  [1]=>
164  object(Test1)#%d (2) {
165    ["id"]=>
166    string(1) "2"
167    ["val"]=>
168    string(1) "B"
169  }
170  [2]=>
171  object(Test1)#%d (2) {
172    ["id"]=>
173    string(1) "3"
174    ["val"]=>
175    string(1) "C"
176  }
177  [3]=>
178  object(Test1)#%d (2) {
179    ["id"]=>
180    string(1) "4"
181    ["val"]=>
182    string(1) "D"
183  }
184}
185Test1::factory(1,A)
186Test1::__construct(1,A)
187Test1::factory(2,B)
188Test1::__construct(2,B)
189Test1::factory(3,C)
190Test1::__construct(3,C)
191Test1::factory(4,D)
192Test1::__construct(4,D)
193array(4) {
194  [0]=>
195  object(Test1)#%d (2) {
196    ["id"]=>
197    string(1) "1"
198    ["val"]=>
199    string(1) "A"
200  }
201  [1]=>
202  object(Test1)#%d (2) {
203    ["id"]=>
204    string(1) "2"
205    ["val"]=>
206    string(1) "B"
207  }
208  [2]=>
209  object(Test1)#%d (2) {
210    ["id"]=>
211    string(1) "3"
212    ["val"]=>
213    string(1) "C"
214  }
215  [3]=>
216  object(Test1)#%d (2) {
217    ["id"]=>
218    string(1) "4"
219    ["val"]=>
220    string(1) "D"
221  }
222}
223string(16) "DerivedStatement"
224DerivedStatement::reTrieve(1,A)
225DerivedStatement::reTrieve(2,B)
226DerivedStatement::reTrieve(3,C)
227DerivedStatement::reTrieve(4,D)
228array(4) {
229  [0]=>
230  array(1) {
231    [1]=>
232    string(1) "A"
233  }
234  [1]=>
235  array(1) {
236    [2]=>
237    string(1) "B"
238  }
239  [2]=>
240  array(1) {
241    [3]=>
242    string(1) "C"
243  }
244  [3]=>
245  array(1) {
246    [4]=>
247    string(1) "D"
248  }
249}
250DerivedStatement::reTrieve(1,A)
251DerivedStatement::reTrieve(2,B)
252DerivedStatement::reTrieve(3,C)
253DerivedStatement::reTrieve(4,D)
254array(4) {
255  [0]=>
256  array(1) {
257    [1]=>
258    string(1) "A"
259  }
260  [1]=>
261  array(1) {
262    [2]=>
263    string(1) "B"
264  }
265  [2]=>
266  array(1) {
267    [3]=>
268    string(1) "C"
269  }
270  [3]=>
271  array(1) {
272    [4]=>
273    string(1) "D"
274  }
275}
276DerivedStatement::reTrieve(1,A)
277DerivedStatement::reTrieve(2,B)
278DerivedStatement::reTrieve(3,C)
279DerivedStatement::reTrieve(4,D)
280array(4) {
281  [0]=>
282  array(1) {
283    [1]=>
284    string(1) "A"
285  }
286  [1]=>
287  array(1) {
288    [2]=>
289    string(1) "B"
290  }
291  [2]=>
292  array(1) {
293    [3]=>
294    string(1) "C"
295  }
296  [3]=>
297  array(1) {
298    [4]=>
299    string(1) "D"
300  }
301}
302