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