1--TEST-- 2Interface of the class mysqli 3--EXTENSIONS-- 4mysqli 5--SKIPIF-- 6<?php 7require_once('skipifconnectfailure.inc'); 8?> 9--FILE-- 10<?php 11 require('connect.inc'); 12 13 $mysqli = new mysqli($host, $user, $passwd, $db, $port, $socket); 14 $link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket); 15 16 printf("Parent class:\n"); 17 var_dump(get_parent_class($mysqli)); 18 19 printf("\nMethods:\n"); 20 $methods = get_class_methods($mysqli); 21 $expected_methods = array( 22 '__construct' => true, 23 'autocommit' => true, 24 'begin_transaction' => true, 25 'change_user' => true, 26 'character_set_name' => true, 27 'close' => true, 28 'commit' => true, 29 'connect' => true, 30 'dump_debug_info' => true, 31 'escape_string' => true, 32 'get_charset' => true, 33 'get_client_info' => true, 34 'get_server_info' => true, 35 'get_warnings' => true, 36 'init' => true, 37 'kill' => true, 38 'more_results' => true, 39 'multi_query' => true, 40 'next_result' => true, 41 'options' => true, 42 'ping' => true, 43 'prepare' => true, 44 'query' => true, 45 'real_connect' => true, 46 'real_escape_string' => true, 47 'real_query' => true, 48 'refresh' => true, 49 'rollback' => true, 50 'release_savepoint' => true, 51 'savepoint' => true, 52 'select_db' => true, 53 'set_charset' => true, 54 'set_opt' => true, 55 'ssl_set' => true, 56 'stat' => true, 57 'stmt_init' => true, 58 'store_result' => true, 59 'thread_safe' => true, 60 'use_result' => true, 61 ); 62 63 if ($IS_MYSQLND) { 64 // mysqlnd only 65 /* $expected_methods['get_client_stats'] = true; */ 66 $expected_methods['get_connection_stats'] = true; 67 $expected_methods['reap_async_query'] = true; 68 $expected_methods['poll'] = true; 69 } 70 71 /* we should add ruled when to expect them */ 72 if (function_exists('mysqli_debug')) 73 $expected_methods['debug'] = true; 74 if (function_exists('ssl_set')) 75 $expected_methods['ssl_set'] = true; 76 77 foreach ($methods as $k => $method) { 78 if (isset($expected_methods[$method])) { 79 unset($methods[$k]); 80 unset($expected_methods[$method]); 81 } 82 } 83 if (!empty($methods)) { 84 printf("Dumping list of unexpected methods.\n"); 85 var_dump($methods); 86 } 87 if (!empty($expected_methods)) { 88 printf("Dumping list of missing methods.\n"); 89 var_dump($expected_methods); 90 } 91 if (empty($methods) && empty($expected_methods)) 92 printf("ok\n"); 93 94 printf("\nClass variables:\n"); 95 96 $expected_class_variables = [ 97 "affected_rows" => true, 98 "client_info" => true, 99 "client_version" => true, 100 "connect_errno" => true, 101 "connect_error" => true, 102 "errno" => true, 103 "error" => true, 104 "field_count" => true, 105 "host_info" => true, 106 "info" => true, 107 "insert_id" => true, 108 "protocol_version" => true, 109 "server_info" => true, 110 "server_version" => true, 111 "sqlstate" => true, 112 "thread_id" => true, 113 "warning_count" => true, 114 "error_list" => true, 115 ]; 116 117 $expected_object_variables = []; 118 119 $variables = get_class_vars(get_class($mysqli)); 120 foreach ($variables as $var => $v) { 121 if (isset($expected_class_variables[$var])) { 122 unset($expected_class_variables[$var]); 123 unset($variables[$var]); 124 } 125 } 126 127 if (!empty($expected_class_variables)) { 128 printf("Dumping list of missing class variables\n"); 129 var_dump($expected_class_variables); 130 } 131 if (!empty($variables)) { 132 printf("Dumping list of unexpected class variables\n"); 133 var_dump($variables); 134 } 135 echo "ok\n"; 136 137 printf("\nObject variables:\n"); 138 $variables = get_object_vars($mysqli); 139 foreach ($variables as $var => $v) { 140 if (isset($expected_object_variables[$var])) { 141 unset($expected_object_variables[$var]); 142 unset($variables[$var]); 143 } 144 } 145 146 if (!empty($expected_object_variables)) { 147 printf("Dumping list of missing object variables\n"); 148 var_dump($expected_object_variables); 149 } 150 if (!empty($variables)) { 151 printf("Dumping list of unexpected object variables\n"); 152 var_dump($variables); 153 } 154 echo "ok\n"; 155 156 157 printf("\nMagic, magic properties:\n"); 158 159 assert(mysqli_affected_rows($link) === $mysqli->affected_rows); 160 printf("mysqli->affected_rows = '%s'/%s ('%s'/%s)\n", 161 $mysqli->affected_rows, gettype($mysqli->affected_rows), 162 mysqli_affected_rows($link), gettype(mysqli_affected_rows($link))); 163 164 assert(mysqli_get_client_info() === $mysqli->client_info); 165 printf("mysqli->client_info = '%s'/%s ('%s'/%s)\n", 166 $mysqli->client_info, gettype($mysqli->client_info), 167 mysqli_get_client_info(), gettype(mysqli_get_client_info())); 168 169 assert(mysqli_get_client_version() === $mysqli->client_version); 170 printf("mysqli->client_version = '%s'/%s ('%s'/%s)\n", 171 $mysqli->client_version, gettype($mysqli->client_version), 172 mysqli_get_client_version(), gettype(mysqli_get_client_version())); 173 174 assert(mysqli_errno($link) === $mysqli->errno); 175 printf("mysqli->errno = '%s'/%s ('%s'/%s)\n", 176 $mysqli->errno, gettype($mysqli->errno), 177 mysqli_errno($link), gettype(mysqli_errno($link))); 178 179 assert(mysqli_error($link) === $mysqli->error); 180 printf("mysqli->error = '%s'/%s ('%s'/%s)\n", 181 $mysqli->error, gettype($mysqli->error), 182 mysqli_error($link), gettype(mysqli_error($link))); 183 184 assert(mysqli_error_list($link) === $mysqli->error_list); 185 assert(is_array($mysqli->error_list)); 186 187 assert(mysqli_field_count($link) === $mysqli->field_count); 188 printf("mysqli->field_count = '%s'/%s ('%s'/%s)\n", 189 $mysqli->field_count, gettype($mysqli->field_count), 190 mysqli_field_count($link), gettype(mysqli_field_count($link))); 191 192 assert(mysqli_insert_id($link) === $mysqli->insert_id); 193 printf("mysqli->insert_id = '%s'/%s ('%s'/%s)\n", 194 $mysqli->insert_id, gettype($mysqli->insert_id), 195 mysqli_insert_id($link), gettype(mysqli_insert_id($link))); 196 197 assert(mysqli_sqlstate($link) === $mysqli->sqlstate); 198 printf("mysqli->sqlstate = '%s'/%s ('%s'/%s)\n", 199 $mysqli->sqlstate, gettype($mysqli->sqlstate), 200 mysqli_sqlstate($link), gettype(mysqli_sqlstate($link))); 201 202 assert(mysqli_get_host_info($link) === $mysqli->host_info); 203 printf("mysqli->host_info = '%s'/%s ('%s'/%s)\n", 204 $mysqli->host_info, gettype($mysqli->host_info), 205 mysqli_get_host_info($link), gettype(mysqli_get_host_info($link))); 206 207 /* note that the data types are different */ 208 assert(mysqli_info($link) == $mysqli->info); 209 printf("mysqli->info = '%s'/%s ('%s'/%s)\n", 210 $mysqli->info, gettype($mysqli->info), 211 mysqli_info($link), gettype(mysqli_info($link))); 212 213 assert(mysqli_thread_id($link) > $mysqli->thread_id); 214 assert(gettype($mysqli->thread_id) == gettype(mysqli_thread_id($link))); 215 printf("mysqli->thread_id = '%s'/%s ('%s'/%s)\n", 216 $mysqli->thread_id, gettype($mysqli->thread_id), 217 mysqli_thread_id($link), gettype(mysqli_thread_id($link))); 218 219 assert(mysqli_get_proto_info($link) === $mysqli->protocol_version); 220 printf("mysqli->protocol_version = '%s'/%s ('%s'/%s)\n", 221 $mysqli->protocol_version, gettype($mysqli->protocol_version), 222 mysqli_get_proto_info($link), gettype(mysqli_get_proto_info($link))); 223 224 assert(mysqli_get_server_info($link) === $mysqli->server_info); 225 printf("mysqli->server_info = '%s'/%s ('%s'/%s)\n", 226 $mysqli->server_info, gettype($mysqli->server_info), 227 mysqli_get_server_info($link), gettype(mysqli_get_server_info($link))); 228 229 assert(mysqli_get_server_version($link) === $mysqli->server_version); 230 printf("mysqli->server_version = '%s'/%s ('%s'/%s)\n", 231 $mysqli->server_version, gettype($mysqli->server_version), 232 mysqli_get_server_version($link), gettype(mysqli_get_server_version($link))); 233 234 assert(mysqli_warning_count($link) === $mysqli->warning_count); 235 printf("mysqli->warning_count = '%s'/%s ('%s'/%s)\n", 236 $mysqli->warning_count, gettype($mysqli->warning_count), 237 mysqli_warning_count($link), gettype(mysqli_warning_count($link))); 238 239 printf("\nAccess to undefined properties:\n"); 240 printf("mysqli->unknown = '%s'\n", @$mysqli->unknown); 241 242 @$mysqli->unknown = 13; 243 printf("setting mysqli->unknown, mysqli_unknown = '%s'\n", @$mysqli->unknown); 244 245 $unknown = 'friday'; 246 @$mysqli->unknown = $unknown; 247 printf("setting mysqli->unknown, mysqli_unknown = '%s'\n", @$mysqli->unknown); 248 249 $mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket); 250 printf("\nAccess hidden properties for MYSLQI_STATUS_INITIALIZED (TODO documentation):\n"); 251 assert(mysqli_connect_error() === $mysqli->connect_error); 252 printf("mysqli->connect_error = '%s'/%s ('%s'/%s)\n", 253 $mysqli->connect_error, gettype($mysqli->connect_error), 254 mysqli_connect_error(), gettype(mysqli_connect_error())); 255 256 assert(mysqli_connect_errno() === $mysqli->connect_errno); 257 printf("mysqli->connect_errno = '%s'/%s ('%s'/%s)\n", 258 $mysqli->connect_errno, gettype($mysqli->connect_errno), 259 mysqli_connect_errno(), gettype(mysqli_connect_errno())); 260 261 print "done!"; 262?> 263--EXPECTF-- 264Parent class: 265bool(false) 266 267Methods: 268ok 269 270Class variables: 271ok 272 273Object variables: 274ok 275 276Magic, magic properties: 277mysqli->affected_rows = '%s'/integer ('%s'/integer) 278mysqli->client_info = '%s'/string ('%s'/string) 279mysqli->client_version = '%d'/integer ('%d'/integer) 280mysqli->errno = '0'/integer ('0'/integer) 281mysqli->error = ''/string (''/string) 282mysqli->field_count = '0'/integer ('0'/integer) 283mysqli->insert_id = '0'/integer ('0'/integer) 284mysqli->sqlstate = '00000'/string ('00000'/string) 285mysqli->host_info = '%s'/string ('%s'/string) 286mysqli->info = ''/NULL (''/NULL) 287mysqli->thread_id = '%d'/integer ('%d'/integer) 288mysqli->protocol_version = '%d'/integer ('%d'/integer) 289mysqli->server_info = '%s'/string ('%s'/string) 290mysqli->server_version = '%d'/integer ('%d'/integer) 291mysqli->warning_count = '0'/integer ('0'/integer) 292 293Access to undefined properties: 294mysqli->unknown = '' 295setting mysqli->unknown, mysqli_unknown = '13' 296setting mysqli->unknown, mysqli_unknown = 'friday' 297 298Access hidden properties for MYSLQI_STATUS_INITIALIZED (TODO documentation): 299mysqli->connect_error = ''/NULL (''/NULL) 300mysqli->connect_errno = '0'/integer ('0'/integer) 301done! 302