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