1--TEST--
2Interface of the class mysqli_result
3--SKIPIF--
4<?php
5require_once('skipif.inc');
6require_once('skipifemb.inc');
7require_once('skipifconnectfailure.inc');
8?>
9--FILE--
10<?php
11	require('connect.inc');
12	require('table.inc');
13
14	$mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket);
15	$mysqli_result = $mysqli->query('SELECT * FROM test');
16	$row = $mysqli_result->fetch_row();
17
18	$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket);
19	$res = mysqli_query($link, 'SELECT * FROM test');
20	assert(mysqli_fetch_row($res) === $row);
21
22	printf("Parent class:\n");
23	var_dump(get_parent_class($mysqli_result));
24
25	printf("\nMethods:\n");
26	$methods = get_class_methods($mysqli_result);
27	$expected_methods = array(
28		'__construct'           => true,
29		'close'                 => true,
30		'data_seek'             => true,
31		'fetch_array'           => true,
32		'fetch_assoc'           => true,
33		'fetch_field'           => true,
34		'fetch_field_direct'    => true,
35		'fetch_fields'          => true,
36		'fetch_object'          => true,
37		'fetch_row'             => true,
38		'field_seek'            => true,
39		'free'                  => true,
40		'free_result'           => true,
41	);
42	if ($IS_MYSQLND)
43		$expected_methods['fetch_all'] = true;
44
45	foreach ($methods as $k => $method) {
46		if (isset($expected_methods[$method])) {
47			unset($expected_methods[$method]);
48			unset($methods[$k]);
49		}
50		if ($method == 'mysqli_result') {
51			// get_class_method reports different constructor names
52			unset($expected_methods['__construct']);
53			unset($methods[$k]);
54		}
55	}
56
57	if (!empty($expected_methods)) {
58		printf("Dumping list of missing methods.\n");
59		var_dump($expected_methods);
60	}
61	if (!empty($methods)) {
62		printf("Dumping list of unexpected methods.\n");
63		var_dump($methods);
64	}
65	if (empty($expected_methods) && empty($methods))
66		printf("ok\n");
67
68
69	printf("\nClass variables:\n");
70	$variables = array_keys(get_class_vars(get_class($mysqli_result)));
71	sort($variables);
72	foreach ($variables as $k => $var)
73		printf("%s\n", $var);
74
75	printf("\nObject variables:\n");
76	$variables = array_keys(get_object_vars($mysqli_result));
77	foreach ($variables as $k => $var)
78		printf("%s\n", $var);
79
80	printf("\nMagic, magic properties:\n");
81
82	assert(($tmp = mysqli_field_tell($res)) === $mysqli_result->current_field);
83	printf("mysqli_result->current_field = '%s'/%s ('%s'/%s)\n",
84		$mysqli_result->current_field, gettype($mysqli_result->current_field),
85		$tmp, gettype($tmp));
86
87	assert(($tmp = mysqli_field_count($link)) === $mysqli_result->field_count);
88	printf("mysqli_result->field_count = '%s'/%s ('%s'/%s)\n",
89		$mysqli_result->field_count, gettype($mysqli_result->field_count),
90		$tmp, gettype($tmp));
91
92	assert(($tmp = mysqli_fetch_lengths($res)) === $mysqli_result->lengths);
93	printf("mysqli_result->lengths -> '%s'/%s ('%s'/%s)\n",
94		((is_array($mysqli_result->lengths)) ? implode(' ', $mysqli_result->lengths) : 'n/a'),
95		gettype($mysqli_result->lengths),
96		((is_array($tmp)) ? implode(' ', $tmp) : 'n/a'),
97		gettype($tmp));
98
99	assert(($tmp = mysqli_num_rows($res)) === $mysqli_result->num_rows);
100	printf("mysqli_result->num_rows = '%s'/%s ('%s'/%s)\n",
101		$mysqli_result->num_rows, gettype($mysqli_result->num_rows),
102		$tmp, gettype($tmp));
103
104	assert(in_array($mysqli_result->type, array(MYSQLI_STORE_RESULT, MYSQLI_USE_RESULT)));
105	printf("mysqli_result->type = '%s'/%s\n",
106		((MYSQLI_STORE_RESULT == $mysqli_result->type) ? 'store' : 'use'),
107		gettype($mysqli_result->type));
108
109	printf("\nAccess to undefined properties:\n");
110	printf("mysqli_result->unknown = '%s'\n", @$mysqli_result->unknown);
111
112	printf("\nConstructor:\n");
113	if (!is_object($res = new mysqli_result($link)))
114		printf("[001] Expecting object/mysqli_result got %s/%s\n", gettye($res), $res);
115
116	if (null !== ($tmp = @$res->num_rows))
117		printf("[002] Expecting NULL got %s/%s\n", gettype($tmp), $tmp);
118
119	if (!mysqli_query($link, "SELECT id FROM test ORDER BY id"))
120		printf("[003] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
121
122	if (!is_object($res = new mysqli_result($link)))
123		printf("[004] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
124
125	if (!is_object($res = new mysqli_result($link, MYSQLI_STORE_RESULT)))
126		printf("[005] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
127
128	if (!is_object($res = new mysqli_result($link, MYSQLI_USE_RESULT)))
129		printf("[006] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
130
131	if (!is_object($res = new mysqli_result($link, 'invalid')))
132		printf("[007] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
133
134	$valid = array(MYSQLI_STORE_RESULT, MYSQLI_USE_RESULT);
135	do {
136		$mode = mt_rand(-1000, 1000);
137	} while (in_array($mode, $valid));
138
139	if ($TEST_EXPERIMENTAL) {
140		ob_start();
141		if (!is_object($res = new mysqli_result($link, $mode)))
142			printf("[008] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
143		$content = ob_get_contents();
144		ob_end_clean();
145		if (!stristr($content, 'Invalid value for resultmode'))
146			printf("[009] Expecting warning because of invalid resultmode\n");
147	}
148
149	if (!is_object($res = new mysqli_result('foo')))
150		printf("[010] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
151
152	if (!is_object($res = @new mysqli_result($link, MYSQLI_STORE_RESULT, 1)))
153		printf("[011] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
154
155	print "done!";
156?>
157--EXPECTF--
158Parent class:
159bool(false)
160
161Methods:
162ok
163
164Class variables:
165current_field
166field_count
167lengths
168num_rows
169type
170
171Object variables:
172current_field
173field_count
174lengths
175num_rows
176type
177
178Magic, magic properties:
179mysqli_result->current_field = '0'/integer ('0'/integer)
180mysqli_result->field_count = '2'/integer ('2'/integer)
181mysqli_result->lengths -> '1 1'/array ('1 1'/array)
182mysqli_result->num_rows = '6'/integer ('6'/integer)
183mysqli_result->type = 'store'/integer
184
185Access to undefined properties:
186mysqli_result->unknown = ''
187
188Constructor:
189
190Warning: mysqli_result::__construct() expects parameter 2 to be long, %unicode_string_optional% given in %s on line %d
191
192Warning: mysqli_result::__construct() expects parameter 1 to be mysqli, %unicode_string_optional% given in %s on line %d
193done!