1--TEST--
2MySQL PDOStatement->bindValue()
3--SKIPIF--
4<?php
5require_once(__DIR__ . DIRECTORY_SEPARATOR . 'skipif.inc');
6require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
7MySQLPDOTest::skip();
8$db = MySQLPDOTest::factory();
9?>
10--FILE--
11<?php
12    require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
13    $db = MySQLPDOTest::factory();
14    MySQLPDOTest::createTestTable($db);
15
16    printf("Testing native PS...\n");
17    try {
18        $db->setAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY, 0);
19        if (0 != $db->getAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY))
20            printf("[002] Unable to turn off emulated prepared statements\n");
21
22        printf("Binding variable...\n");
23        $stmt = $db->prepare('SELECT id, label FROM test WHERE id > ? ORDER BY id ASC LIMIT 2');
24        $in = 0;
25        if (!$stmt->bindValue(1, $in))
26            printf("[003] Cannot bind value, %s %s\n",
27                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
28
29        $stmt->execute();
30        $id = $label = null;
31
32        if (!$stmt->bindColumn(1, $id, PDO::PARAM_INT))
33            printf("[004] Cannot bind integer column, %s %s\n",
34                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
35
36        if (!$stmt->bindColumn(2, $label, PDO::PARAM_STR))
37            printf("[005] Cannot bind string column, %s %s\n",
38                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
39
40        while ($stmt->fetch(PDO::FETCH_BOUND))
41            printf("in = %d -> id = %s (%s) / label = %s (%s)\n",
42                $in,
43                var_export($id, true), gettype($id),
44                var_export($label, true), gettype($label));
45
46        printf("Binding value and not variable...\n");
47        if (!$stmt->bindValue(1, 0))
48            printf("[006] Cannot bind value, %s %s\n",
49                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
50
51        $stmt->execute();
52        $id = $label = null;
53
54        if (!$stmt->bindColumn(1, $id, PDO::PARAM_INT))
55            printf("[007] Cannot bind integer column, %s %s\n",
56                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
57
58        if (!$stmt->bindColumn(2, $label, PDO::PARAM_STR))
59            printf("[008] Cannot bind string column, %s %s\n",
60                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
61
62        while ($stmt->fetch(PDO::FETCH_BOUND))
63            printf("in = %d -> id = %s (%s) / label = %s (%s)\n",
64                $in,
65                var_export($id, true), gettype($id),
66                var_export($label, true), gettype($label));
67
68        printf("Binding variable which references another variable...\n");
69        $in = 0;
70        $in_ref = &$in;
71        if (!$stmt->bindValue(1, $in_ref))
72            printf("[009] Cannot bind value, %s %s\n",
73                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
74
75        $stmt->execute();
76        $id = $label = null;
77
78        if (!$stmt->bindColumn(1, $id, PDO::PARAM_INT))
79            printf("[010] Cannot bind integer column, %s %s\n",
80                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
81
82        if (!$stmt->bindColumn(2, $label, PDO::PARAM_STR))
83            printf("[011] Cannot bind string column, %s %s\n",
84                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
85
86        while ($stmt->fetch(PDO::FETCH_BOUND))
87            printf("in = %d -> id = %s (%s) / label = %s (%s)\n",
88                $in,
89                var_export($id, true), gettype($id),
90                var_export($label, true), gettype($label));
91
92
93        printf("Binding a variable and a value...\n");
94        $stmt = $db->prepare('SELECT id, label FROM test WHERE id > ? AND id <= ? ORDER BY id ASC LIMIT 2');
95        $in = 0;
96        if (!$stmt->bindValue(1, $in))
97            printf("[012] Cannot bind value, %s %s\n",
98                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
99
100        if (!$stmt->bindValue(2, 2))
101            printf("[013] Cannot bind value, %s %s\n",
102                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
103
104        $stmt->execute();
105        $id = $label = null;
106
107        if (!$stmt->bindColumn(1, $id, PDO::PARAM_INT))
108            printf("[014] Cannot bind integer column, %s %s\n",
109                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
110
111        if (!$stmt->bindColumn(2, $label, PDO::PARAM_STR))
112            printf("[015] Cannot bind string column, %s %s\n",
113                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
114
115        while ($stmt->fetch(PDO::FETCH_BOUND))
116            printf("in = %d -> id = %s (%s) / label = %s (%s)\n",
117                $in,
118                var_export($id, true), gettype($id),
119                var_export($label, true), gettype($label));
120
121        printf("Binding a variable to two placeholders and changing the variable value in between the binds...\n");
122        // variable value change shall have no impact
123        $stmt = $db->prepare('SELECT id, label FROM test WHERE id > ? AND id <= ? ORDER BY id ASC LIMIT 2');
124        $in = 0;
125        if (!$stmt->bindValue(1, $in))
126            printf("[016] Cannot bind value, %s %s\n",
127                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
128
129        $in = 2;
130        if (!$stmt->bindValue(2, $in))
131            printf("[017] Cannot bind value, %s %s\n",
132                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
133
134        $stmt->execute();
135        $id = $label = null;
136
137        if (!$stmt->bindColumn(1, $id, PDO::PARAM_INT))
138            printf("[018] Cannot bind integer column, %s %s\n",
139                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
140
141        if (!$stmt->bindColumn(2, $label, PDO::PARAM_STR))
142            printf("[019] Cannot bind string column, %s %s\n",
143                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
144
145        while ($stmt->fetch(PDO::FETCH_BOUND))
146            printf("in = %d -> id = %s (%s) / label = %s (%s)\n",
147                $in,
148                var_export($id, true), gettype($id),
149                var_export($label, true), gettype($label));
150
151    } catch (PDOException $e) {
152        printf("[001] %s [%s] %s\n",
153            $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo()));
154    }
155
156    printf("Testing emulated PS...\n");
157    try {
158        $db->setAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY, 1);
159        if (1 != $db->getAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY))
160            printf("[002] Unable to turn on emulated prepared statements\n");
161
162        printf("Binding variable...\n");
163        $stmt = $db->prepare('SELECT id, label FROM test WHERE id > ? ORDER BY id ASC LIMIT 2');
164        $in = 0;
165        if (!$stmt->bindValue(1, $in))
166            printf("[003] Cannot bind value, %s %s\n",
167                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
168
169        $stmt->execute();
170        $id = $label = null;
171
172        if (!$stmt->bindColumn(1, $id, PDO::PARAM_INT))
173            printf("[004] Cannot bind integer column, %s %s\n",
174                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
175
176        if (!$stmt->bindColumn(2, $label, PDO::PARAM_STR))
177            printf("[005] Cannot bind string column, %s %s\n",
178                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
179
180        while ($stmt->fetch(PDO::FETCH_BOUND))
181            printf("in = %d -> id = %s (%s) / label = %s (%s)\n",
182                $in,
183                var_export($id, true), gettype($id),
184                var_export($label, true), gettype($label));
185
186        printf("Binding value and not variable...\n");
187        if (!$stmt->bindValue(1, 0))
188            printf("[006] Cannot bind value, %s %s\n",
189                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
190
191        $stmt->execute();
192        $id = $label = null;
193
194        if (!$stmt->bindColumn(1, $id, PDO::PARAM_INT))
195            printf("[007] Cannot bind integer column, %s %s\n",
196                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
197
198        if (!$stmt->bindColumn(2, $label, PDO::PARAM_STR))
199            printf("[008] Cannot bind string column, %s %s\n",
200                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
201
202        while ($stmt->fetch(PDO::FETCH_BOUND))
203            printf("in = %d -> id = %s (%s) / label = %s (%s)\n",
204                $in,
205                var_export($id, true), gettype($id),
206                var_export($label, true), gettype($label));
207
208        printf("Binding variable which references another variable...\n");
209        $in = 0;
210        $in_ref = &$in;
211        if (!$stmt->bindValue(1, $in_ref))
212            printf("[009] Cannot bind value, %s %s\n",
213                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
214
215        $stmt->execute();
216        $id = $label = null;
217
218        if (!$stmt->bindColumn(1, $id, PDO::PARAM_INT))
219            printf("[010] Cannot bind integer column, %s %s\n",
220                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
221
222        if (!$stmt->bindColumn(2, $label, PDO::PARAM_STR))
223            printf("[011] Cannot bind string column, %s %s\n",
224                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
225
226        while ($stmt->fetch(PDO::FETCH_BOUND))
227            printf("in = %d -> id = %s (%s) / label = %s (%s)\n",
228                $in,
229                var_export($id, true), gettype($id),
230                var_export($label, true), gettype($label));
231
232
233        printf("Binding a variable and a value...\n");
234        $stmt = $db->prepare('SELECT id, label FROM test WHERE id > ? AND id <= ? ORDER BY id ASC LIMIT 2');
235        $in = 0;
236        if (!$stmt->bindValue(1, $in))
237            printf("[012] Cannot bind value, %s %s\n",
238                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
239
240        if (!$stmt->bindValue(2, 2))
241            printf("[013] Cannot bind value, %s %s\n",
242                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
243
244        $stmt->execute();
245        $id = $label = null;
246
247        if (!$stmt->bindColumn(1, $id, PDO::PARAM_INT))
248            printf("[014] Cannot bind integer column, %s %s\n",
249                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
250
251        if (!$stmt->bindColumn(2, $label, PDO::PARAM_STR))
252            printf("[015] Cannot bind string column, %s %s\n",
253                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
254
255        while ($stmt->fetch(PDO::FETCH_BOUND))
256            printf("in = %d -> id = %s (%s) / label = %s (%s)\n",
257                $in,
258                var_export($id, true), gettype($id),
259                var_export($label, true), gettype($label));
260
261        printf("Binding a variable to two placeholders and changing the variable value in between the binds...\n");
262        // variable value change shall have no impact
263        $stmt = $db->prepare('SELECT id, label FROM test WHERE id > ? AND id <= ? ORDER BY id ASC LIMIT 2');
264        $in = 0;
265        if (!$stmt->bindValue(1, $in))
266            printf("[016] Cannot bind value, %s %s\n",
267                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
268
269        $in = 2;
270        if (!$stmt->bindValue(2, $in))
271            printf("[017] Cannot bind value, %s %s\n",
272                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
273
274        $stmt->execute();
275        $id = $label = null;
276
277        if (!$stmt->bindColumn(1, $id, PDO::PARAM_INT))
278            printf("[018] Cannot bind integer column, %s %s\n",
279                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
280
281        if (!$stmt->bindColumn(2, $label, PDO::PARAM_STR))
282            printf("[019] Cannot bind string column, %s %s\n",
283                $stmt->errorCode(), var_export($stmt->errorInfo(), true));
284
285        while ($stmt->fetch(PDO::FETCH_BOUND))
286            printf("in = %d -> id = %s (%s) / label = %s (%s)\n",
287                $in,
288                var_export($id, true), gettype($id),
289                var_export($label, true), gettype($label));
290
291    } catch (PDOException $e) {
292        printf("[001] %s [%s] %s\n",
293            $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo()));
294    }
295
296    print "done!";
297?>
298--CLEAN--
299<?php
300require __DIR__ . '/mysql_pdo_test.inc';
301MySQLPDOTest::dropTestTable();
302?>
303--EXPECT--
304Testing native PS...
305Binding variable...
306in = 0 -> id = 1 (integer) / label = 'a' (string)
307in = 0 -> id = 2 (integer) / label = 'b' (string)
308Binding value and not variable...
309in = 0 -> id = 1 (integer) / label = 'a' (string)
310in = 0 -> id = 2 (integer) / label = 'b' (string)
311Binding variable which references another variable...
312in = 0 -> id = 1 (integer) / label = 'a' (string)
313in = 0 -> id = 2 (integer) / label = 'b' (string)
314Binding a variable and a value...
315in = 0 -> id = 1 (integer) / label = 'a' (string)
316in = 0 -> id = 2 (integer) / label = 'b' (string)
317Binding a variable to two placeholders and changing the variable value in between the binds...
318in = 2 -> id = 1 (integer) / label = 'a' (string)
319in = 2 -> id = 2 (integer) / label = 'b' (string)
320Testing emulated PS...
321Binding variable...
322in = 0 -> id = 1 (integer) / label = 'a' (string)
323in = 0 -> id = 2 (integer) / label = 'b' (string)
324Binding value and not variable...
325in = 0 -> id = 1 (integer) / label = 'a' (string)
326in = 0 -> id = 2 (integer) / label = 'b' (string)
327Binding variable which references another variable...
328in = 0 -> id = 1 (integer) / label = 'a' (string)
329in = 0 -> id = 2 (integer) / label = 'b' (string)
330Binding a variable and a value...
331in = 0 -> id = 1 (integer) / label = 'a' (string)
332in = 0 -> id = 2 (integer) / label = 'b' (string)
333Binding a variable to two placeholders and changing the variable value in between the binds...
334in = 2 -> id = 1 (integer) / label = 'a' (string)
335in = 2 -> id = 2 (integer) / label = 'b' (string)
336done!
337