1--TEST--
2mysqli_stmt_bind_param used with call_user_func_array() (see also bug #43568)
3--SKIPIF--
4<?php
5require_once('skipif.inc');
6require_once('skipifemb.inc');
7require_once('skipifconnectfailure.inc');
8
9// TODO remove once a decision has been made on call_user_func_array()
10if (version_compare(PHP_VERSION, '5.3.0-dev') == -1)
11	die("skip needs PHP 5.3.0-dev+, see http://bugs.php.net/bug.php?id=43568");
12?>
13--FILE--
14<?php
15	require('connect.inc');
16	require('table.inc');
17
18	if (!$stmt = mysqli_stmt_init($link))
19		printf("[001] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
20
21	if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
22		printf("[002] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
23
24	$id = 1;
25	if (!mysqli_stmt_bind_param($stmt, 'i', $id) ||
26		!mysqli_stmt_execute($stmt))
27		printf("[003] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
28
29	$id = $label = null;
30	if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
31		(true !== mysqli_stmt_fetch($stmt)))
32		printf("[004] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
33
34	print "Regular, procedural, using variables\n";
35	var_dump($id);
36	var_dump($label);
37
38	mysqli_stmt_close($stmt);
39	if (!$stmt = mysqli_stmt_init($link))
40		printf("[005] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
41
42	if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
43		printf("[006] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
44
45	$types = 'i';
46	$id = 1;
47	$params = array(
48		0 => &$stmt,
49		1 => &$types,
50		2 => &$id
51	);
52	if (!call_user_func_array('mysqli_stmt_bind_param', $params))
53		printf("[007] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
54
55	if (!mysqli_stmt_execute($stmt))
56		printf("[008] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
57
58	$id = $label = null;
59	if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
60		(true !== mysqli_stmt_fetch($stmt)))
61		printf("[009] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
62
63	print "Call user func, procedural, using references for everything\n";
64	var_dump($id);
65	var_dump($label);
66
67	mysqli_stmt_close($stmt);
68	if (!$stmt = mysqli_stmt_init($link))
69		printf("[010] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
70
71	if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
72		printf("[011] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
73
74	$types = 'i';
75	$id = 1;
76	$params = array(
77		0 => &$types,
78		1 => &$id
79	);
80	if (!call_user_func_array(array($stmt, 'bind_param'), $params))
81		printf("[012] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
82
83	if (!mysqli_stmt_execute($stmt))
84		printf("[013] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
85
86	$id = $label = null;
87	if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
88		(true !== mysqli_stmt_fetch($stmt)))
89		printf("[014] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
90
91	print "Call user func, object oriented, using references for everything\n";
92	var_dump($id);
93	var_dump($label);
94
95	mysqli_stmt_close($stmt);
96	if (!$stmt = mysqli_stmt_init($link))
97		printf("[015] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
98
99	if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
100		printf("[016] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
101
102	$types = 'i';
103	$id = 1;
104	$params = array(
105		0 => $types,
106		1 => &$id
107	);
108	if (!call_user_func_array(array($stmt, 'bind_param'), $params))
109		printf("[017] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
110
111	if (!mysqli_stmt_execute($stmt))
112		printf("[018] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
113
114	$id = $label = null;
115	if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
116		(true !== mysqli_stmt_fetch($stmt)))
117		printf("[019] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
118
119	print "Call user func, object oriented, using variable for types. using references for bound parameter\n";
120	var_dump($id);
121	var_dump($label);
122
123	mysqli_stmt_close($stmt);
124	if (!$stmt = mysqli_stmt_init($link))
125		printf("[020] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
126
127	if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
128		printf("[021] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
129
130	$id = 1;
131	$params = array(
132		0 => 'i',
133		1 => &$id
134	);
135	if (!call_user_func_array(array($stmt, 'bind_param'), $params))
136		printf("[022] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
137
138	if (!mysqli_stmt_execute($stmt))
139		printf("[023] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
140
141	$id = $label = null;
142	if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
143		(true !== mysqli_stmt_fetch($stmt)))
144		printf("[024] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
145
146	print "Call user func, object oriented, using constant for types. using references for bound parameter\n";
147	var_dump($id);
148	var_dump($label);
149
150	mysqli_stmt_close($stmt);
151	if (!$stmt = mysqli_stmt_init($link))
152		printf("[025] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
153
154	if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
155		printf("[026] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
156
157	$types = 'i';
158	$id = 1;
159	$params = array(
160		0 => &$stmt,
161		1 => $types,
162		2 => &$id
163	);
164	if (!call_user_func_array('mysqli_stmt_bind_param', $params))
165		printf("[027] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
166
167	if (!mysqli_stmt_execute($stmt))
168		printf("[028] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
169
170	$id = $label = null;
171	if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
172		(true !== mysqli_stmt_fetch($stmt)))
173		printf("[029] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
174
175	print "Call user func, procedural, using references for everything but using variable for types\n";
176	var_dump($id);
177	var_dump($label);
178
179	mysqli_stmt_close($stmt);
180	if (!$stmt = mysqli_stmt_init($link))
181		printf("[025] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
182
183	if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
184		printf("[026] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
185
186	$types = 'i';
187	$id = 1;
188	$params = array(
189		0 => $stmt,
190		1 => $types,
191		2 => &$id
192	);
193	if (!call_user_func_array('mysqli_stmt_bind_param', $params))
194		printf("[027] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
195
196	if (!mysqli_stmt_execute($stmt))
197		printf("[028] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
198
199	$id = $label = null;
200	if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
201		(true !== mysqli_stmt_fetch($stmt)))
202		printf("[029] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
203
204	print "Call user func, procedural, using references for bound parameter, using variables for resource and types\n";
205	var_dump($id);
206	var_dump($label);
207
208	mysqli_stmt_close($stmt);
209	if (!$stmt = mysqli_stmt_init($link))
210		printf("[030] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
211
212	if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
213		printf("[031] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
214
215	$types = 'i';
216	$id = 1;
217	$params = array(
218		0 => $stmt,
219		1 => $types,
220		2 => &$id
221	);
222	if (!call_user_func_array('mysqli_stmt_bind_param', $params))
223		printf("[032] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
224
225	if (!mysqli_stmt_execute($stmt))
226		printf("[033] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
227
228	$id = $label = null;
229	if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
230		(true !== mysqli_stmt_fetch($stmt)))
231		printf("[034] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
232
233	print "Call user func, procedural, using references for bound parameter, using variables for resource and types\n";
234	var_dump($id);
235	var_dump($label);
236
237	mysqli_stmt_close($stmt);
238	if (!$stmt = mysqli_stmt_init($link))
239		printf("[035] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
240
241	if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
242		printf("[036] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
243
244	$id = 1;
245	$params = array(
246		0 => $stmt,
247		1 => 'i',
248		2 => &$id
249	);
250	if (!call_user_func_array('mysqli_stmt_bind_param', $params))
251		printf("[037] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
252
253	if (!mysqli_stmt_execute($stmt))
254		printf("[038] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
255
256	$id = $label = null;
257	if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
258		(true !== mysqli_stmt_fetch($stmt)))
259		printf("[039] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
260
261	print "Call user func, procedural, using references for bound parameter, using variable for resource, using constant for types\n";
262	var_dump($id);
263	var_dump($label);
264
265	mysqli_stmt_close($stmt);
266	if (!$stmt = mysqli_stmt_init($link))
267		printf("[040] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
268
269	if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
270		printf("[041] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
271
272	$id = 1;
273	if (!call_user_func_array('mysqli_stmt_bind_param', array($stmt, 'i', &$id)))
274		printf("[042] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
275
276	if (!mysqli_stmt_execute($stmt))
277		printf("[043] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
278
279	$id = $label = null;
280	if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
281		(true !== mysqli_stmt_fetch($stmt)))
282		printf("[044] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
283
284	print "Call user func, procedural, using references for bound parameter, using variable for resource, using constant for types, array\n";
285	var_dump($id);
286	var_dump($label);
287
288	//
289	// Any of those shall fail - see also bugs.php.net/43568
290	//
291	mysqli_stmt_close($stmt);
292	if (!$stmt = mysqli_stmt_init($link))
293		printf("[045] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
294
295	if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
296		printf("[046] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
297
298	$id = 1;
299	$params = array(
300		0 => 'i',
301		1 => &$id
302	);
303	if (!call_user_func_array(array($stmt, 'bind_param'), $params))
304		printf("[047] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
305
306	if (!mysqli_stmt_execute($stmt))
307		printf("[048] [%d] (Message might vary with MySQL Server version, e.g. No data supplied for parameters in prepared statement)\n", mysqli_stmt_errno($stmt));
308
309	mysqli_stmt_close($stmt);
310	if (!$stmt = mysqli_stmt_init($link))
311		printf("[049] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
312
313	if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
314		printf("[050] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
315
316	$types = 'i';
317	$id = 1;
318	$params = array(
319		0 => $stmt,
320		1 => 'i',
321		2 => &$id
322	);
323	if (!call_user_func_array('mysqli_stmt_bind_param', $params))
324		printf("[051] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
325
326	if (!mysqli_stmt_execute($stmt))
327		printf("[052] [%d] (Message might vary with MySQL Server version, e.g. No data supplied for parameters in prepared statement)\n", mysqli_stmt_errno($stmt));
328
329	print "done!";
330?>
331--CLEAN--
332<?php
333	require_once("clean_table.inc");
334?>
335--EXPECTF--
336Regular, procedural, using variables
337int(1)
338%unicode|string%(1) "a"
339Call user func, procedural, using references for everything
340int(1)
341%unicode|string%(1) "a"
342Call user func, object oriented, using references for everything
343int(1)
344%unicode|string%(1) "a"
345Call user func, object oriented, using variable for types. using references for bound parameter
346int(1)
347%unicode|string%(1) "a"
348Call user func, object oriented, using constant for types. using references for bound parameter
349int(1)
350%unicode|string%(1) "a"
351Call user func, procedural, using references for everything but using variable for types
352int(1)
353%unicode|string%(1) "a"
354Call user func, procedural, using references for bound parameter, using variables for resource and types
355int(1)
356%unicode|string%(1) "a"
357Call user func, procedural, using references for bound parameter, using variables for resource and types
358int(1)
359%unicode|string%(1) "a"
360Call user func, procedural, using references for bound parameter, using variable for resource, using constant for types
361int(1)
362%unicode|string%(1) "a"
363Call user func, procedural, using references for bound parameter, using variable for resource, using constant for types, array
364int(1)
365%unicode|string%(1) "a"
366done!