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