php-src/ext/mysqli/tests/mysqli_fetch_fields.phpt
Nikita Popov 890e4caf0b Drop support for max_length in mysqli_fetch_fields()
Retain the field, but always populate it with zero. This was
already the case for PS without length updating.

max_length has nothing lost in the field metadata -- it is a
property of the specific result set, and requires scanning the
whole result set to compute. PHP itself never uses max_length
with mysqlnd, it is only exposed in the raw mysqli API.

Keeping it for just that purpose is not worthwhile given the costs
involved. People who actually need this for some reason can easily
calculate it themselves, while making it obvious that the
calculation requires a full result set scan.
2020-12-17 10:01:02 +01:00

115 lines
2.4 KiB
PHP

--TEST--
mysqli_fetch_fields()
--SKIPIF--
<?php
require_once('skipif.inc');
require_once('skipifconnectfailure.inc');
?>
--FILE--
<?php
require_once("connect.inc");
// Note: no SQL type tests, internally the same function gets used as for mysqli_fetch_array() which does a lot of SQL type test
require('table.inc');
// Make sure that client, connection and result charsets are all the
// same. Not sure whether this is strictly necessary.
if (!mysqli_set_charset($link, 'utf8'))
printf("[%d] %s\n", mysqli_errno($link), mysqli_errno($link));
$charsetInfo = mysqli_get_charset($link);
if (!$res = mysqli_query($link, "SELECT id AS ID, label FROM test AS TEST ORDER BY id LIMIT 1")) {
printf("[003] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
}
$fields = mysqli_fetch_fields($res);
foreach ($fields as $k => $field) {
var_dump($field);
switch ($k) {
case 1:
/* label column, result set charset */
if ($field->charsetnr != $charsetInfo->number) {
printf("[004] Expecting charset %s/%d got %d\n",
$charsetInfo->charset,
$charsetInfo->number, $field->charsetnr);
}
break;
}
}
mysqli_free_result($res);
try {
mysqli_fetch_fields($res);
} catch (Error $exception) {
echo $exception->getMessage() . "\n";
}
mysqli_close($link);
print "done!";
?>
--CLEAN--
<?php
require_once("clean_table.inc");
?>
--EXPECTF--
object(stdClass)#%d (13) {
["name"]=>
string(2) "ID"
["orgname"]=>
string(2) "id"
["table"]=>
string(4) "TEST"
["orgtable"]=>
string(%d) "%s"
["def"]=>
string(0) ""
["db"]=>
string(%d) "%s"
["catalog"]=>
string(%d) "%s"
["max_length"]=>
int(0)
["length"]=>
int(11)
["charsetnr"]=>
int(63)
["flags"]=>
int(49155)
["type"]=>
int(3)
["decimals"]=>
int(0)
}
object(stdClass)#%d (13) {
["name"]=>
string(5) "label"
["orgname"]=>
string(5) "label"
["table"]=>
string(4) "TEST"
["orgtable"]=>
string(%d) "%s"
["def"]=>
string(0) ""
["db"]=>
string(%d) "%s"
["catalog"]=>
string(%d) "%s"
["max_length"]=>
int(0)
["length"]=>
int(%d)
["charsetnr"]=>
int(%d)
["flags"]=>
int(0)
["type"]=>
int(254)
["decimals"]=>
int(0)
}
mysqli_result object is already closed
done!