mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00

This environment variable serves to hide (parts of) tests from general execution, and as the test failures show when that environment variable is set, apparently it serves to hide (parts of) test from being executed at all, thus causing test rot. To avoid this in the future, we drop `MYSQL_TEST_EXPERIMENTAL`, and fix the failing tests, except for mysqli_get_warnings.phpt, which appears to be broken beyond repair, and whose most important tests are already covered by other test cases. Co-authored-by: Kamil Tekiela <tekiela246@gmail.com>
170 lines
5.3 KiB
PHP
170 lines
5.3 KiB
PHP
--TEST--
|
|
Interface of the class mysqli_result
|
|
--EXTENSIONS--
|
|
mysqli
|
|
--SKIPIF--
|
|
<?php
|
|
require_once 'skipifconnectfailure.inc';
|
|
?>
|
|
--FILE--
|
|
<?php
|
|
require 'table.inc';
|
|
|
|
$mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket);
|
|
$mysqli_result = $mysqli->query('SELECT * FROM test');
|
|
$row = $mysqli_result->fetch_row();
|
|
|
|
$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket);
|
|
$res = mysqli_query($link, 'SELECT * FROM test');
|
|
assert(mysqli_fetch_row($res) === $row);
|
|
|
|
printf("Parent class:\n");
|
|
var_dump(get_parent_class($mysqli_result));
|
|
|
|
printf("\nMethods:\n");
|
|
$methods = get_class_methods($mysqli_result);
|
|
$expected_methods = array(
|
|
'__construct' => true,
|
|
'close' => true,
|
|
'data_seek' => true,
|
|
'fetch_all' => true,
|
|
'fetch_array' => true,
|
|
'fetch_assoc' => true,
|
|
'fetch_field' => true,
|
|
'fetch_field_direct' => true,
|
|
'fetch_fields' => true,
|
|
'fetch_object' => true,
|
|
'fetch_row' => true,
|
|
'fetch_column' => true,
|
|
'field_seek' => true,
|
|
'free' => true,
|
|
'free_result' => true,
|
|
'getIterator' => true,
|
|
);
|
|
|
|
foreach ($methods as $k => $method) {
|
|
if (isset($expected_methods[$method])) {
|
|
unset($expected_methods[$method]);
|
|
unset($methods[$k]);
|
|
}
|
|
if ($method == 'mysqli_result') {
|
|
// get_class_method reports different constructor names
|
|
unset($expected_methods['__construct']);
|
|
unset($methods[$k]);
|
|
}
|
|
}
|
|
|
|
if (!empty($expected_methods)) {
|
|
printf("Dumping list of missing methods.\n");
|
|
var_dump($expected_methods);
|
|
}
|
|
if (!empty($methods)) {
|
|
printf("Dumping list of unexpected methods.\n");
|
|
var_dump($methods);
|
|
}
|
|
if (empty($expected_methods) && empty($methods))
|
|
printf("ok\n");
|
|
|
|
|
|
printf("\nClass variables:\n");
|
|
$variables = array_keys(get_class_vars(get_class($mysqli_result)));
|
|
sort($variables);
|
|
foreach ($variables as $var)
|
|
printf("%s\n", $var);
|
|
|
|
printf("\nObject variables:\n");
|
|
$variables = array_keys(get_object_vars($mysqli_result));
|
|
foreach ($variables as $var)
|
|
printf("%s\n", $var);
|
|
|
|
printf("\nMagic, magic properties:\n");
|
|
|
|
assert(($tmp = mysqli_field_tell($res)) === $mysqli_result->current_field);
|
|
printf("mysqli_result->current_field = '%s'/%s ('%s'/%s)\n",
|
|
$mysqli_result->current_field, gettype($mysqli_result->current_field),
|
|
$tmp, gettype($tmp));
|
|
|
|
assert(($tmp = mysqli_field_count($link)) === $mysqli_result->field_count);
|
|
printf("mysqli_result->field_count = '%s'/%s ('%s'/%s)\n",
|
|
$mysqli_result->field_count, gettype($mysqli_result->field_count),
|
|
$tmp, gettype($tmp));
|
|
|
|
assert(($tmp = mysqli_fetch_lengths($res)) === $mysqli_result->lengths);
|
|
printf("mysqli_result->lengths -> '%s'/%s ('%s'/%s)\n",
|
|
((is_array($mysqli_result->lengths)) ? implode(' ', $mysqli_result->lengths) : 'n/a'),
|
|
gettype($mysqli_result->lengths),
|
|
((is_array($tmp)) ? implode(' ', $tmp) : 'n/a'),
|
|
gettype($tmp));
|
|
|
|
assert(($tmp = mysqli_num_rows($res)) === $mysqli_result->num_rows);
|
|
printf("mysqli_result->num_rows = '%s'/%s ('%s'/%s)\n",
|
|
$mysqli_result->num_rows, gettype($mysqli_result->num_rows),
|
|
$tmp, gettype($tmp));
|
|
|
|
assert(in_array($mysqli_result->type, array(MYSQLI_STORE_RESULT, MYSQLI_USE_RESULT)));
|
|
printf("mysqli_result->type = '%s'/%s\n",
|
|
((MYSQLI_STORE_RESULT == $mysqli_result->type) ? 'store' : 'use'),
|
|
gettype($mysqli_result->type));
|
|
|
|
printf("\nAccess to undefined properties:\n");
|
|
printf("mysqli_result->unknown = '%s'\n", @$mysqli_result->unknown);
|
|
|
|
printf("\nConstructor:\n");
|
|
$res = new mysqli_result($link);
|
|
|
|
try {
|
|
$res->num_rows;
|
|
} catch (Error $exception) {
|
|
echo $exception->getMessage() . "\n";
|
|
}
|
|
|
|
if (!mysqli_query($link, "SELECT id FROM test ORDER BY id"))
|
|
printf("[003] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
|
|
|
|
new mysqli_result($link);
|
|
new mysqli_result($link, MYSQLI_STORE_RESULT);
|
|
new mysqli_result($link, MYSQLI_USE_RESULT);
|
|
|
|
$valid = array(MYSQLI_STORE_RESULT, MYSQLI_USE_RESULT);
|
|
do {
|
|
$mode = mt_rand(-1000, 1000);
|
|
} while (in_array($mode, $valid));
|
|
|
|
try {
|
|
new mysqli_result($link, $mode);
|
|
} catch (ValueError $ex) {
|
|
echo $ex->getMessage(), "\n";
|
|
}
|
|
|
|
print "done!";
|
|
?>
|
|
--EXPECT--
|
|
Parent class:
|
|
bool(false)
|
|
|
|
Methods:
|
|
ok
|
|
|
|
Class variables:
|
|
current_field
|
|
field_count
|
|
lengths
|
|
num_rows
|
|
type
|
|
|
|
Object variables:
|
|
|
|
Magic, magic properties:
|
|
mysqli_result->current_field = '0'/integer ('0'/integer)
|
|
mysqli_result->field_count = '2'/integer ('2'/integer)
|
|
mysqli_result->lengths -> '1 1'/array ('1 1'/array)
|
|
mysqli_result->num_rows = '6'/integer ('6'/integer)
|
|
mysqli_result->type = 'store'/integer
|
|
|
|
Access to undefined properties:
|
|
mysqli_result->unknown = ''
|
|
|
|
Constructor:
|
|
mysqli_result object is already closed
|
|
mysqli_result::__construct(): Argument #2 ($result_mode) must be either MYSQLI_STORE_RESULT or MYSQLI_USE_RESULT
|
|
done!
|