1--TEST-- 2mysqli_stmt_get_result() - meta data 3--SKIPIF-- 4<?php 5require_once('skipif.inc'); 6require_once('skipifconnectfailure.inc'); 7 8if (!function_exists('mysqli_stmt_get_result')) 9 die('skip mysqli_stmt_get_result not available'); 10?> 11--FILE-- 12<?php 13 require('table.inc'); 14 15 if (!$stmt = mysqli_stmt_init($link)) 16 printf("[001] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); 17 18 if (!mysqli_stmt_prepare($stmt, "SELECT id, label FROM test ORDER BY id ASC LIMIT 3")) 19 printf("[002] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 20 21 if (!mysqli_stmt_execute($stmt)) 22 printf("[003] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 23 24 if (!is_object($res = mysqli_stmt_get_result($stmt)) || 'mysqli_result' != get_class($res)) { 25 printf("[004] Expecting object/mysqli_result got %s/%s, [%d] %s\n", 26 gettype($res), $res, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 27 } 28 29 if (!is_object($res_meta = mysqli_stmt_result_metadata($stmt)) || 30 'mysqli_result' != get_class($res_meta)) { 31 printf("[005] Expecting object/mysqli_result got %s/%s, [%d] %s\n", 32 gettype($res), $res, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 33 } 34 35 var_dump(mysqli_fetch_assoc($res)); 36 var_dump(mysqli_fetch_assoc($res_meta)); 37 38 mysqli_free_result($res); 39 mysqli_free_result($res_meta); 40 mysqli_stmt_close($stmt); 41 42 // !mysqli_stmt_prepare($stmt, "SELECT id, label, id + 1 as _id, concat(label, '_') _label FROM test as _test ORDER BY id ASC LIMIT 3") || 43 if (!($stmt = mysqli_stmt_init($link)) || 44 !mysqli_stmt_prepare($stmt, "SELECT id , label, id + 1 AS _id, label AS _label, null AS _null, CONCAT(label, '_') _label_concat FROM test _test ORDER BY id ASC LIMIT 3") || 45 !mysqli_stmt_execute($stmt)) 46 printf("[006] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 47 48 if (!is_object($res = mysqli_stmt_get_result($stmt)) || 'mysqli_result' != get_class($res)) { 49 printf("[007] Expecting object/mysqli_result got %s/%s, [%d] %s\n", 50 gettype($res), $res, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 51 } 52 53 if (!is_object($res_meta = mysqli_stmt_result_metadata($stmt)) || 54 'mysqli_result' != get_class($res_meta)) { 55 printf("[008] Expecting object/mysqli_result got %s/%s, [%d] %s\n", 56 gettype($res), $res, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt)); 57 } 58 59 if (($tmp1 = mysqli_num_fields($res)) !== ($tmp2 = mysqli_num_fields($res_meta))) { 60 printf("[009] %s/%s !== %s/%s\n", gettype($tmp1), $tmp1, gettype($tmp2), $tmp2); 61 } 62 63 /* 64 if (($tmp1 = mysqli_field_count($link)) !== ($tmp2 = $res->field_count())) 65 printf("[010] %s/%s !== %s/%s\n", gettype($tmp1), $tmp1, gettype($tmp2), $tmp2); 66 67 if (($tmp1 = $res_meta->field_count()) !== $tmp2) 68 printf("[011] %s/%s !== %s/%s\n", gettype($tmp1), $tmp1, gettype($tmp2), $tmp2); 69 */ 70 71 if (($tmp1 = mysqli_field_tell($res)) !== ($tmp2 = $res_meta->current_field)) 72 printf("[012] %s/%s !== %s/%s\n", gettype($tmp1), $tmp1, gettype($tmp2), $tmp2); 73 74 if (0 !== $tmp1) 75 printf("[013] Expecting int/0 got %s/%s\n", gettype($tmp1), $tmp1); 76 77 $fields = array(); 78 while ($info = $res->fetch_field()) 79 $fields['res'][] = $info; 80 var_dump($info); 81 while ($info = $res_meta->fetch_field()) 82 $fields['meta'][] = $info; 83 var_dump($info); 84 $fields['all_res'] = $res->fetch_fields(); 85 $fields['all_meta'] = $res_meta->fetch_fields(); 86 87 if (count($fields['res']) != count($fields['meta'])) { 88 printf("[014] stmt_get_result indicates %d fields, stmt_result_metadata indicates %d fields\n", 89 count($fields['res']), 90 count($fields['meta'])); 91 } 92 93 foreach ($fields['res'] as $k => $info) { 94 printf("%s\n", $info->name); 95 if ($info->name !== $fields['meta'][$k]->name) 96 printf("[015 - %d] Expecting name %s/%s got %s/%s\n", 97 $k, gettype($info->name), $info->name, gettype($fields['meta'][$k]->name), $fields['meta'][$k]->name); 98 99 if ($info->orgname !== $fields['meta'][$k]->orgname) 100 printf("[016 - %d] Expecting orgname %s/%s got %s/%s\n", 101 $k, gettype($info->orgname), $info->orgname, gettype($fields['meta'][$k]->orgname), $fields['meta'][$k]->orgname); 102 103 if ($info->table !== $fields['meta'][$k]->table) 104 printf("[017 - %d] Expecting table %s/%s got %s/%s\n", 105 $k, gettype($info->table), $info->table, gettype($fields['meta'][$k]->table), $fields['meta'][$k]->table); 106 107 if ($info->orgtable !== $fields['meta'][$k]->orgtable) 108 printf("[018 - %d] Expecting orgtable %s/%s got %s/%s\n", 109 $k, gettype($info->orgtable), $info->orgtable, gettype($fields['meta'][$k]->orgtable), $fields['meta'][$k]->orgtable); 110 111 if ($info->def !== $fields['meta'][$k]->def) 112 printf("[019 - %d] Expecting def %s/%s got %s/%s\n", 113 $k, gettype($info->def), $info->def, gettype($fields['meta'][$k]->def), $fields['meta'][$k]->def); 114/* 115 if ($info->max_length !== $fields['meta'][$k]->max_length) 116 printf("[020 - %d] Expecting max_length %s/%s got %s/%s\n", 117 $k, gettype($info->max_length), $info->max_length, gettype($fields['meta'][$k]->max_length), $fields['meta'][$k]->max_length); 118*/ 119 if ($info->length !== $fields['meta'][$k]->length) 120 printf("[021 - %d] Expecting length %s/%s got %s/%s\n", 121 $k, gettype($info->length), $info->length, gettype($fields['meta'][$k]->length), $fields['meta'][$k]->length); 122 123 if ($info->charsetnr !== $fields['meta'][$k]->charsetnr) 124 printf("[022 - %d] Expecting charsetnr %s/%s got %s/%s\n", 125 $k, gettype($info->charsetnr), $info->charsetnr, gettype($fields['meta'][$k]->charsetnr), $fields['meta'][$k]->charsetnr); 126 127 if ($info->flags !== $fields['meta'][$k]->flags) 128 printf("[023 - %d] Expecting flags %s/%s got %s/%s\n", 129 $k, gettype($info->flags), $info->flags, gettype($fields['meta'][$k]->flags), $fields['meta'][$k]->flags); 130 131 if ($info->type !== $fields['meta'][$k]->type) 132 printf("[024 - %d] Expecting type %s/%s got %s/%s\n", 133 $k, gettype($info->type), $info->type, gettype($fields['meta'][$k]->type), $fields['meta'][$k]->type); 134 135 if ($info->decimals !== $fields['meta'][$k]->decimals) 136 printf("[025 - %d] Expecting decimals %s/%s got %s/%s\n", 137 $k, getdecimals($info->decimals), $info->decimals, getdecimals($fields['meta'][$k]->decimals), $fields['meta'][$k]->decimals); 138 139 /* Make them equal for the check */ 140 $tmp = $fields['all_res'][$k]->max_length; 141 $fields['all_res'][$k]->max_length = $fields['all_meta'][$k]->max_length; 142 143 if ($fields['all_res'][$k] != $fields['all_meta'][$k]) { 144 printf("[026 - %d] fetch_fields() seems to have returned different data, dumping\n", $k); 145 var_dump($fields['all_res'][$k]); 146 var_dump($fields['all_meta'][$k]); 147 } 148 $fields['all_res'][$k]->max_length = $tmp; 149 } 150 151 $num = count($fields['res']); 152 for ($i = 0; $i < 100; $i++) { 153 $pos = mt_rand(-1, $num + 1); 154 if ($pos >= 0 && $pos < $num) { 155 if (true !== mysqli_field_seek($res, $pos)) 156 printf("[027] field_seek(res) failed\n"); 157 if (true !== $res_meta->field_seek($pos)) 158 printf("[028] field_seek(res__meta) failed\n"); 159 160 $tmp1 = $res->fetch_field(); 161 $tmp2 = mysqli_fetch_field($res_meta); 162 $tmp2->max_length = $tmp1->max_length; 163 if ($tmp1 != $tmp2) { 164 printf("[029] Field info differs, dumping data\n"); 165 var_dump($tmp1); 166 var_dump($tmp2); 167 } 168 169 if ($tmp1 != $fields['res'][$pos]) { 170 printf("[030] Field info differs, dumping data\n"); 171 var_dump($tmp1); 172 var_dump($fields['res'][$pos]); 173 } 174 175 $pos++; 176 if ($pos !== ($tmp = mysqli_field_tell($res))) 177 printf("[031] Expecting %s/%s got %s/%s\n", 178 gettype($pos), $pos, gettype($tmp), $tmp); 179 180 if ($pos !== ($tmp = mysqli_field_tell($res_meta))) 181 printf("[032] Expecting %s/%s got %s/%s\n", 182 gettype($pos), $pos, gettype($tmp), $tmp); 183 } else { 184 try { 185 $tmp = @mysqli_field_seek($res, $pos); 186 if ($pos >= $num && $tmp !== false) { 187 printf("[033] field_seek(%d) did not fail\n", $pos); 188 } 189 } catch (ValueError $e) { /* Suppress output because pos is RANDOM */} 190 191 try { 192 $tmp = @mysqli_field_seek($res_meta, $pos); 193 if ($pos >= $num && $tmp !== false) { 194 printf("[034] field_seek(%d) did not fail\n", $pos); 195 } 196 } catch (ValueError $e) { /* Suppress output because pos is RANDOM */} 197 } 198 } 199 200 $res->free_result(); 201 mysqli_free_result($res_meta); 202 203 try { 204 mysqli_fetch_field($res); 205 } catch (Error $exception) { 206 echo $exception->getMessage() . "\n"; 207 } 208 209 mysqli_stmt_close($stmt); 210 211 try { 212 mysqli_fetch_field($res); 213 } catch (Error $exception) { 214 echo $exception->getMessage() . "\n"; 215 } 216 217 mysqli_close($link); 218 219 try { 220 mysqli_fetch_field($res); 221 } catch (Error $exception) { 222 echo $exception->getMessage() . "\n"; 223 } 224 225 print "done!"; 226?> 227--CLEAN-- 228<?php 229 require_once("clean_table.inc"); 230?> 231--EXPECT-- 232array(2) { 233 ["id"]=> 234 int(1) 235 ["label"]=> 236 string(1) "a" 237} 238NULL 239bool(false) 240bool(false) 241id 242label 243_id 244_label 245_null 246_label_concat 247mysqli_result object is already closed 248mysqli_result object is already closed 249mysqli_result object is already closed 250done! 251