mysqli_result::fetch_field

mysqli_fetch_field

(PHP 5, PHP 7, PHP 8)

mysqli_result::fetch_field -- mysqli_fetch_field返回结果集中下一个字段

说明

面向对象风格

public mysqli_result::fetch_field(): object|false

过程式风格

mysqli_fetch_field(mysqli_result $result): object|false

将结果集的一列的定义返回为对象。重复调用此函数以检索结果集中所有列的信息。

参数

result

仅过程式风格:由 mysqli_query()mysqli_store_result()mysqli_use_result()mysqli_stmt_get_result() 返回的 mysqli_result 对象。

返回值

返回包含字段定义信息的 **`false`** 对象,如果没有字段信息可用,则返回 **`false`**。

对象属性
属性 说明
name 列的名称
orgname 如果指定了别名,则为原始列名
table 此字段所属的表的名称(如果未计算)
orgtable 如果指定了别名,则为原始表名
def 未使用。始终为空字符串
db 数据库的名称
catalog 未使用。始终为 `“def”`
max_length 结果集的字段最大宽度。从 PHP 8.1 开始,此值始终为 `0`。
length 字段的宽度(以字节为单位)。对于字符串列,length 值会根据连接字符集而变化。例如,如果字符集是 `latin1`(单字节字符集),则 `SELECT 'abc'` 查询的 length 值为 3。如果字符集是 `utf8mb4`(多字节字符集,其中字符最多占用 4 个字节),则 length 值为 12。
charsetnr 字段的字符集编号。
flags 表示字段位标志的整数。
type 用于此字段的数据类型
decimals 数值字段的小数位数,以及时间字段的小数秒精度。

示例

示例 #1 面向对象风格

<?php
$mysqli
= new mysqli("localhost", "my_user", "my_password", "world");

/* 检查连接 */
if (mysqli_connect_errno()) {
printf("连接失败:%s\n", mysqli_connect_error());
exit();
}

$query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5";

if (
$result = $mysqli->query($query)) {

/* 获取所有列的字段信息 */
while ($finfo = $result->fetch_field()) {

printf("Name: %s\n", $finfo->name);
printf("Table: %s\n", $finfo->table);
printf("max. Len: %d\n", $finfo->max_length);
printf("Flags: %d\n", $finfo->flags);
printf("Type: %d\n\n", $finfo->type);
}
$result->close();
}

/* 关闭连接 */
$mysqli->close();
?>

示例 #2 过程式风格

<?php
$link
= mysqli_connect("localhost", "my_user", "my_password", "world");

/* 检查连接 */
if (mysqli_connect_errno()) {
printf("连接失败:%s\n", mysqli_connect_error());
exit();
}

$query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5";

if (
$result = mysqli_query($link, $query)) {

/* 获取所有字段的字段信息 */
while ($finfo = mysqli_fetch_field($result)) {

printf("Name: %s\n", $finfo->name);
printf("Table: %s\n", $finfo->table);
printf("max. Len: %d\n", $finfo->max_length);
printf("Flags: %d\n", $finfo->flags);
printf("Type: %d\n\n", $finfo->type);
}
mysqli_free_result($result);
}

/* 关闭连接 */
mysqli_close($link);
?>

上面的示例将输出

Name:     Name
Table:    Country
max. Len: 11
Flags:    1
Type:     254

Name:     SurfaceArea
Table:    Country
max. Len: 10
Flags:    32769
Type:     4

参见

添加说明

用户贡献说明 8 条说明

iansoko at hotmail dot com
12 年前
以下是与 fetch_field 返回的 TYPE 编号相对应的數據类型。

我把它发布在这里,因为我在其他地方找不到这个信息。

数值型
-------------
BIT: 16
TINYINT: 1
BOOL: 1
SMALLINT: 2
MEDIUMINT: 9
INTEGER: 3
BIGINT: 8
SERIAL: 8
FLOAT: 4
DOUBLE: 5
DECIMAL: 246
NUMERIC: 246
FIXED: 246

日期型
------------
DATE: 10
DATETIME: 12
TIMESTAMP: 7
TIME: 11
YEAR: 13

字符串 & 二进制
------------
CHAR: 254
VARCHAR: 253
ENUM: 254
SET: 254
BINARY: 254
VARBINARY: 253
TINYBLOB: 252
BLOB: 252
MEDIUMBLOB: 252
TINYTEXT: 252
TEXT: 252
MEDIUMTEXT: 252
LONGTEXT: 252
匿名
12 年前
由 fetch_field 返回的 TYPE 编号的常量在此列出 (MYSQLI_TYPE_*)
https://php.net/manual/en/mysqli.constants.php
ragtag at hotmail dot com
15 年前
MySql 使用的标志是
NOT_NULL_FLAG = 1
PRI_KEY_FLAG = 2
UNIQUE_KEY_FLAG = 4
BLOB_FLAG = 16
UNSIGNED_FLAG = 32
ZEROFILL_FLAG = 64
BINARY_FLAG = 128
ENUM_FLAG = 256
AUTO_INCREMENT_FLAG = 512
TIMESTAMP_FLAG = 1024
SET_FLAG = 2048
NUM_FLAG = 32768
PART_KEY_FLAG = 16384
GROUP_FLAG = 32768
UNIQUE_FLAG = 65536

要测试是否设置了标志,可以使用 & 如下所示
<?php
$meta
= $mysqli_result_object->fetch_field();
if (
$meta->flags & 4) {
echo
'Unique key flag is set';
}
?>
andre at koethur dot de
10 年前
这里有两种方法可以将 'type' 和 'flags' 属性转换为文本以进行调试。它们都使用预定义的 MYSQLI_ 常量来生成文本。

<?php

public static function h_type2txt($type_id)
{
static
$types;

if (!isset(
$types))
{
$types = array();
$constants = get_defined_constants(true);
foreach (
$constants['mysqli'] as $c => $n) if (preg_match('/^MYSQLI_TYPE_(.*)/', $c, $m)) $types[$n] = $m[1];
}

return
array_key_exists($type_id, $types)? $types[$type_id] : NULL;
}

public static function
h_flags2txt($flags_num)
{
static
$flags;

if (!isset(
$flags))
{
$flags = array();
$constants = get_defined_constants(true);
foreach (
$constants['mysqli'] as $c => $n) if (preg_match('/MYSQLI_(.*)_FLAG$/', $c, $m)) if (!array_key_exists($n, $flags)) $flags[$n] = $m[1];
}

$result = array();
foreach (
$flags as $n => $t) if ($flags_num & $n) $result[] = $t;
return
implode(' ', $result);
}

?>
sofe2038 at gmail dot com
6 年前
上面一些评论中的常量似乎不准确。以下是一些更官方的参考资料,似乎很难搜索。

"type" 属性:https://dev.mysqlserver.cn/doc/internals/en/com-query-response.html#column-type
"flags" 属性:https://github.com/google/mysql/blob/master/include/mysql_com.h#L133

此外,COM_QUERY_RESPONSE 页面上也解释了所有属性:https://dev.mysqlserver.cn/doc/internals/en/com-query-response.html#column-definition
rvila at revolutionvisualarts dot com
7 年前
由函数 get_predefined_constants() 返回的预定义常量值用于

MYSQLI_TYPE_CHAR = 1
MYSQLI _TYPE_TINYINT = 1

如果代码用于对字段类型进行分类,使用这些值当然会造成混淆。例如

if($fieldtype === "CHAR"){
$field_html_attribute = "text";
$field_html_length = 1;
} elseif($fieldtype === "TINYINT") {
$field_html_attribute = "number";
$field_html_length = 1;
}

如果创建一个数组,将键设置为数值,将该键的值设置为文本标题,TINYINT 将被 CHAR 值替换。但是,如果此过程被反转,那么当标志的数值等于当前键的值作为第一个实例时,代码将选择 TINYINT,如果 foreach 语句设置为中断。

基于 Johnathan 在https://php.net/manual/en/mysqli.field-count.php 上添加的注释,这些值应该是

CHAR = 254
TINYINT = 1

但是预定义函数属性将值 254 赋予 MYSQLI_TYPE_STRING。

仅供参考
nick
6 年前
无法通过 fetch_fields() 获取枚举或集合字段的值。据我所知,这是因为 mysqlnd api 中尚未实现它,但无论原因是什么,这都是不可能的,您必须直接发出类似 SHOW COLUMNS 的查询并询问结果以确定它们。

顺便说一下,您需要检查 enum_flag 而不是查找 enum_type 来确定字段是否为枚举。返回的类型通常是某种字符串。
miqrogroove at gmail dot com
11 年前
注意预定义常量的值。它们并不总是与实际的字段类型相关联。例如

MYSQLI_TYPE_BLOB: 252
MYSQLI_TYPE_TINY_BLOB: 249
MYSQLI_TYPE_MEDIUM_BLOB: 250
MYSQLI_TYPE_LONG_BLOB: 251

MySQLi 确实会为 tinytext 字段返回 252 的值,但正如您所见,这与 MYSQLI_TYPE_TINY_BLOB 的值不一致。
To Top