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!