1--TEST-- 2Interface of the class mysqli_stmt 3--SKIPIF-- 4<?php 5 require_once('skipif.inc'); 6 require_once('skipifemb.inc'); 7 require_once('skipifconnectfailure.inc'); 8?> 9--FILE-- 10<?php 11 require('connect.inc'); 12 require('table.inc'); 13 14 $link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket); 15 $stmt = new mysqli_stmt($link); 16 17 printf("Parent class:\n"); 18 var_dump(get_parent_class($stmt)); 19 20 printf("\nMethods:\n"); 21 22 $methods = get_class_methods($stmt); 23 $expected_methods = array( 24 '__construct' => true, 25 'attr_get' => true, 26 'attr_set' => true, 27 'bind_param' => true, 28 'bind_result' => true, 29 'close' => true, 30 'data_seek' => true, 31 'execute' => true, 32 'fetch' => true, 33 'free_result' => true, 34 'get_warnings' => true, 35 'num_rows' => true, 36 'prepare' => true, 37 'reset' => true, 38 'result_metadata' => true, 39 'send_long_data' => true, 40 'store_result' => true, 41 ); 42 43 if ($IS_MYSQLND) { 44 $expected_methods['get_result'] = true; 45 $expected_methods['more_results'] = true; 46 $expected_methods['next_result'] = true; 47 } 48 49 foreach ($methods as $k => $method) { 50 if (isset($expected_methods[$method])) { 51 unset($methods[$k]); 52 unset($expected_methods[$method]); 53 } 54 if ($method == 'mysqli_stmt') { 55 // get_class_method reports different constructor names 56 unset($expected_methods['__construct']); 57 unset($methods[$k]); 58 } 59 } 60 if (!empty($methods)) { 61 printf("More methods found than indicated. Dumping list of unexpected methods.\n"); 62 var_dump($methods); 63 } 64 if (!empty($expected_methods)) { 65 printf("Some methods are missing. Dumping list of missing methods.\n"); 66 var_dump($expected_methods); 67 } 68 if (empty($methods) && empty($expected_methods)) 69 printf("ok\n"); 70 71 printf("\nClass variables:\n"); 72 $variables = array_keys(get_class_vars(get_class($stmt))); 73 sort($variables); 74 foreach ($variables as $k => $var) 75 printf("%s\n", $var); 76 77 printf("\nObject variables:\n"); 78 $variables = array_keys(get_object_vars($stmt)); 79 foreach ($variables as $k => $var) 80 printf("%s\n", $var); 81 82printf("\nMagic, magic properties:\n"); 83 84assert(mysqli_stmt_affected_rows($stmt) === $stmt->affected_rows); 85printf("stmt->affected_rows = '%s'\n", $stmt->affected_rows); 86 87if (!$stmt->prepare("INSERT INTO test(id, label) VALUES (100, 'z')") || 88!$stmt->execute()) 89printf("[001] [%d] %s\n", $stmt->errno, $stmt->error); 90 91assert(mysqli_stmt_affected_rows($stmt) === $stmt->affected_rows); 92printf("stmt->affected_rows = '%s'\n", $stmt->affected_rows); 93 94assert(mysqli_stmt_errno($stmt) === $stmt->errno); 95printf("stmt->errno = '%s'\n", $stmt->errno); 96 97assert(mysqli_stmt_error($stmt) === $stmt->error); 98printf("stmt->error = '%s'\n", $stmt->error); 99 100assert(mysqli_stmt_error_list($stmt) === $stmt->error_list); 101var_dump("stmt->error = ", $stmt->error_list); 102 103assert(mysqli_stmt_field_count($stmt) === $stmt->field_count); 104printf("stmt->field_count = '%s'\n", $stmt->field_count); 105 106assert($stmt->id > 0); 107printf("stmt->id = '%s'\n", $stmt->id); 108 109assert(mysqli_stmt_insert_id($stmt) === $stmt->insert_id); 110printf("stmt->insert_id = '%s'\n", $stmt->insert_id); 111 112assert(mysqli_stmt_num_rows($stmt) === $stmt->num_rows); 113printf("stmt->num_rows = '%s'\n", $stmt->num_rows); 114 115assert(mysqli_stmt_param_count($stmt) === $stmt->param_count); 116printf("stmt->param_count = '%s'\n", $stmt->param_count); 117 118assert(mysqli_stmt_sqlstate($stmt) === $stmt->sqlstate); 119printf("stmt->sqlstate = '%s'\n", $stmt->sqlstate); 120 121printf("\nAccess to undefined properties:\n"); 122printf("stmt->unknown = '%s'\n", @$stmt->unknown); 123@$stmt->unknown = 13; 124printf("stmt->unknown = '%s'\n", @$stmt->unknown); 125 126printf("\nPrepare using the constructor:\n"); 127$stmt = new mysqli_stmt($link, 'SELECT id FROM test ORDER BY id'); 128if (!$stmt->execute()) 129printf("[002] [%d] %s\n", $stmt->errno, $stmt->error); 130$stmt->close(); 131 132$obj = new stdClass(); 133if (!is_object($stmt = new mysqli_stmt($link, $obj))) 134printf("[003] Expecting NULL got %s/%s\n", gettype($stmt), $stmt); 135 136print "done!"; 137?> 138--EXPECTF-- 139Parent class: 140bool(false) 141 142Methods: 143ok 144 145Class variables: 146affected_rows 147errno 148error 149error_list 150field_count 151id 152insert_id 153num_rows 154param_count 155sqlstate 156 157Object variables: 158affected_rows 159insert_id 160num_rows 161param_count 162field_count 163errno 164error 165error_list 166sqlstate 167id 168 169Magic, magic properties: 170 171Warning: mysqli_stmt_affected_rows(): invalid object or resource mysqli_stmt 172 in %s on line %d 173 174Warning: main(): Property access is not allowed yet in %s on line %d 175 176Warning: main(): Property access is not allowed yet in %s on line %d 177stmt->affected_rows = '' 178stmt->affected_rows = '1' 179stmt->errno = '0' 180stmt->error = '' 181string(14) "stmt->error = " 182array(0) { 183} 184stmt->field_count = '0' 185stmt->id = '%d' 186stmt->insert_id = '0' 187stmt->num_rows = '0' 188stmt->param_count = '0' 189stmt->sqlstate = '00000' 190 191Access to undefined properties: 192stmt->unknown = '' 193stmt->unknown = '13' 194 195Prepare using the constructor: 196 197Warning: mysqli_stmt::__construct() expects parameter 2 to be %binary_string_optional%, object given in %s on line %d 198done! 199