1--TEST-- 2mysqli_stmt_bind_result() - playing with references 3--SKIPIF-- 4<?php 5require_once('skipif.inc'); 6require_once('skipifemb.inc'); 7require_once('skipifconnectfailure.inc'); 8?> 9--FILE-- 10<?php 11 require('table.inc'); 12 13 $stmt = mysqli_stmt_init($link); 14 if (!mysqli_stmt_prepare($stmt, "SELECT id, label FROM test ORDER BY id LIMIT 1")) 15 printf("[001] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 16 17 if (!mysqli_stmt_prepare($stmt, "SELECT id, label FROM test ORDER BY id LIMIT 1")) 18 printf("[001] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 19 20 21 print "plain vanilla...\n"; 22 unset($id); unset($label); 23 $id = $label = null; 24 if (true !== ($tmp = mysqli_stmt_bind_result($stmt, $id, $label))) 25 printf("[002] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp); 26 27 if (!mysqli_stmt_execute($stmt) || !mysqli_stmt_fetch($stmt) || mysqli_stmt_fetch($stmt)) 28 printf("[003] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 29 30 var_dump($id); 31 var_dump($label); 32 33 34 print "reference, one level...\n"; 35 unset($id); unset($id_ref); unset($label); unset($label_ref); 36 $id = null; 37 $id_ref = &$id; 38 $label = null; 39 $label_ref = &$label; 40 41 if (true !== ($tmp = mysqli_stmt_bind_result($stmt, $id_ref, $label_ref))) 42 printf("[004] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp); 43 44 if (!mysqli_stmt_execute($stmt) || !mysqli_stmt_fetch($stmt) || mysqli_stmt_fetch($stmt)) 45 printf("[005] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 46 var_dump($id_ref); 47 var_dump($id); 48 var_dump($label_ref); 49 var_dump($label); 50 51 52 print "reference, two levels...\n"; 53 unset($id); unset($id_ref); unset($id_ref_ref); unset($label); unset($label_ref); unset($label_ref_ref); 54 $id = null; 55 $id_ref = &$id; 56 $id_ref_ref = &$id_ref; 57 $label = null; 58 $label_ref = &$label; 59 $label_ref_ref = &$label_ref; 60 61 if (true !== ($tmp = mysqli_stmt_bind_result($stmt, $id_ref_ref, $label_ref_ref))) 62 printf("[006] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp); 63 64 if (!mysqli_stmt_execute($stmt) || !mysqli_stmt_fetch($stmt) || mysqli_stmt_fetch($stmt)) 65 printf("[007] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 66 var_dump($id_ref_ref); 67 var_dump($id_ref); 68 var_dump($id); 69 var_dump($label_ref_ref); 70 var_dump($label_ref); 71 var_dump($label); 72 73 print "reference, \$GLOBALS...\n"; 74 unset($id); unset($id_ref); unset($label); unset($label_ref); 75 $id = 100; 76 $id_ref = &$GLOBALS['id']; 77 $label = null; 78 $label_ref = &$GLOBALS['label']; 79 80 if (true !== ($tmp = mysqli_stmt_bind_result($stmt, $id_ref, $label_ref))) 81 printf("[008] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp); 82 83 if (!mysqli_stmt_execute($stmt) || !mysqli_stmt_fetch($stmt) || mysqli_stmt_fetch($stmt)) 84 printf("[009] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 85 var_dump($id_ref); 86 var_dump($id); 87 var_dump($label_ref); 88 var_dump($label); 89 90 print "reference, same target...\n"; 91 $id = null; 92 $label = &$id; 93 94 if (true !== ($tmp = mysqli_stmt_bind_result($stmt, $id, $label))) 95 printf("[010] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp); 96 97 if (!mysqli_stmt_execute($stmt) || !mysqli_stmt_fetch($stmt) || mysqli_stmt_fetch($stmt)) 98 printf("[011] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 99 100 var_dump($id); 101 var_dump($label); 102 103 print "reference, simple object...\n"; 104 unset($obj); 105 $obj = new stdClass(); 106 $obj->id = null; 107 $obj->label = null; 108 109 if (true !== ($tmp = mysqli_stmt_bind_result($stmt, $obj->id, $obj->label))) 110 printf("[012] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp); 111 112 if (!mysqli_stmt_execute($stmt) || !mysqli_stmt_fetch($stmt) || mysqli_stmt_fetch($stmt)) 113 printf("[013] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 114 115 var_dump($obj->id); 116 var_dump($obj->label); 117 118 119 print "reference, simple object w reference...\n"; 120 unset($id); unset($label); unset($obj); 121 $obj = new stdClass(); 122 $obj->id = null; 123 $obj->label = null; 124 $id = &$obj->id; 125 $label = &$obj->label; 126 127 if (true !== ($tmp = mysqli_stmt_bind_result($stmt, $id, $label))) 128 printf("[012] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp); 129 130 if (!mysqli_stmt_execute($stmt) || !mysqli_stmt_fetch($stmt) || mysqli_stmt_fetch($stmt)) 131 printf("[013] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 132 133 var_dump($obj->id); 134 var_dump($obj->label); 135 136 print "reference, simple object w reference, change after bind...\n"; 137 unset($id); unset($label); unset($obj); 138 $obj = new stdClass(); 139 $obj->id = null; 140 $obj->label = null; 141 $id = &$obj->id; 142 $label = &$obj->label; 143 144 if (true !== ($tmp = mysqli_stmt_bind_result($stmt, $id, $label))) 145 printf("[012] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp); 146 147 $label = &$obj->id; 148 $id = null; 149 150 if (!mysqli_stmt_execute($stmt) || !mysqli_stmt_fetch($stmt) || mysqli_stmt_fetch($stmt)) 151 printf("[013] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 152 153 var_dump($obj->id); 154 var_dump($id); 155 var_dump($obj->label); 156 var_dump($label); 157 158 print "reference, one level, change after bind...\n"; 159 unset($id); unset($label); unset($id_ref); unset($label_ref); 160 $id = null; 161 $id_ref = &$id; 162 $label = null; 163 $label_ref = &$label; 164 165 if (true !== ($tmp = mysqli_stmt_bind_result($stmt, $id_ref, $label_ref))) 166 printf("[014] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp); 167 168 $id_ref = 1; 169 $label_ref = 1; 170 171 if (!mysqli_stmt_execute($stmt) || !mysqli_stmt_fetch($stmt) || mysqli_stmt_fetch($stmt)) 172 printf("[015] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 173 var_dump($id_ref); 174 var_dump($id); 175 var_dump($label_ref); 176 var_dump($label); 177 178 print "reference, circle...\n"; 179 unset($id); unset($label_a); unset($label_b); 180 $id = null; 181 $label_a = &$label_b; 182 $label_b = &$label_a; 183 184 if (true !== ($tmp = mysqli_stmt_bind_result($stmt, $id, $label_a))) 185 printf("[016] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp); 186 if (!mysqli_stmt_execute($stmt) || !mysqli_stmt_fetch($stmt) || mysqli_stmt_fetch($stmt)) 187 printf("[017] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 188 189 var_dump($id); 190 var_dump($label_a); 191 var_dump($label_b); 192 193 print "reference, object, forward declaration...\n"; 194 unset($bar); unset($id); unset($label_ref); 195 class foo { 196 public $foo; 197 public function __construct() { 198 $this->foo = &$this->bar; 199 } 200 } 201 class bar extends foo { 202 public $bar = null; 203 } 204 $bar = new bar(); 205 $id = null; 206 $label_ref = &$bar->bar; 207 208 if (true !== ($tmp = mysqli_stmt_bind_result($stmt, $id, $label_ref))) 209 printf("[018] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp); 210 if (!mysqli_stmt_execute($stmt) || !mysqli_stmt_fetch($stmt) || mysqli_stmt_fetch($stmt)) 211 printf("[019] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 212 213 var_dump($id); 214 var_dump($bar); 215 var_dump($label_ref); 216 217 print "references, object, private...\n"; 218 unset($bar); unset($id); unset($label); 219 class mega_bar extends bar { 220 private $id; 221 public $id_ref; 222 public function __construct() { 223 parent::__construct(); 224 $this->id_ref = &$this->id; 225 } 226 } 227 $bar = new mega_bar(); 228 $id = &$bar->id_ref; 229 $label = &$bar->foo; 230 231 if (true !== ($tmp = mysqli_stmt_bind_result($stmt, $id, $label))) 232 printf("[020] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp); 233 if (!mysqli_stmt_execute($stmt) || !mysqli_stmt_fetch($stmt) || mysqli_stmt_fetch($stmt)) 234 printf("[021] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 235 var_dump($id); 236 var_dump($label); 237 var_dump($bar); 238 239 mysqli_stmt_close($stmt); 240 mysqli_close($link); 241 242 print "done!"; 243?> 244--CLEAN-- 245<?php 246 require_once("clean_table.inc"); 247?> 248--EXPECTF-- 249plain vanilla... 250int(1) 251%unicode|string%(1) "a" 252reference, one level... 253int(1) 254int(1) 255%unicode|string%(1) "a" 256%unicode|string%(1) "a" 257reference, two levels... 258int(1) 259int(1) 260int(1) 261%unicode|string%(1) "a" 262%unicode|string%(1) "a" 263%unicode|string%(1) "a" 264reference, $GLOBALS... 265int(1) 266int(1) 267%unicode|string%(1) "a" 268%unicode|string%(1) "a" 269reference, same target... 270%unicode|string%(1) "a" 271%unicode|string%(1) "a" 272reference, simple object... 273int(1) 274%unicode|string%(1) "a" 275reference, simple object w reference... 276int(1) 277%unicode|string%(1) "a" 278reference, simple object w reference, change after bind... 279int(1) 280int(1) 281%unicode|string%(1) "a" 282int(1) 283reference, one level, change after bind... 284int(1) 285int(1) 286%unicode|string%(1) "a" 287%unicode|string%(1) "a" 288reference, circle... 289int(1) 290%unicode|string%(1) "a" 291%unicode|string%(1) "a" 292reference, object, forward declaration... 293int(1) 294object(bar)#%d (2) { 295 [%u|b%"bar"]=> 296 &%unicode|string%(1) "a" 297 [%u|b%"foo"]=> 298 &%unicode|string%(1) "a" 299} 300%unicode|string%(1) "a" 301references, object, private... 302int(1) 303%unicode|string%(1) "a" 304object(mega_bar)#5 (4) { 305 [%s]=> 306 &int(1) 307 [%u|b%"id_ref"]=> 308 &int(1) 309 [%u|b%"bar"]=> 310 &%unicode|string%(1) "a" 311 [%u|b%"foo"]=> 312 &%unicode|string%(1) "a" 313} 314done! 315