mysqli_result::fetch_fields

mysqli_fetch_fields

(PHP 5, PHP 7, PHP 8)

mysqli_result::fetch_fields -- mysqli_fetch_fields返回一个表示结果集中的字段的对象数组

描述

面向对象风格

public mysqli_result::fetch_fields(): array

过程化风格

mysqli_fetch_fields(mysqli_result $result): array

此函数与 mysqli_fetch_field() 函数的功能相同,唯一的区别是,它不是为每个字段返回一个对象,而是将所有列作为对象数组返回。

参数

result

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

返回值

返回一个包含字段定义信息的数组。

对象属性
属性 描述
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("127.0.0.1", "root", "foofoo", "sakila");

/* 检查连接 */
if ($mysqli->connect_errno) {
printf("连接失败: %s\n", $mysqli->connect_error);
exit();
}

foreach (array(
'latin1', 'utf8') as $charset) {

// 设置字符集,以显示其对某些值(例如字节长度)的影响
$mysqli->set_charset($charset);

$query = "SELECT actor_id, last_name from actor ORDER BY actor_id";

echo
"======================\n";
echo
"字符集: $charset\n";
echo
"======================\n";

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

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

foreach (
$finfo as $val) {
printf("名称: %s\n", $val->name);
printf("表: %s\n", $val->table);
printf("最大长度: %d\n", $val->max_length);
printf("长度: %d\n", $val->length);
printf("charsetnr: %d\n", $val->charsetnr);
printf("标志: %d\n", $val->flags);
printf("类型: %d\n\n", $val->type);
}
$result->free();
}
}
$mysqli->close();
?>

示例 #2 过程化风格

<?php
$link
= mysqli_connect("127.0.0.1", "my_user", "my_password", "sakila");

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

foreach (array(
'latin1', 'utf8') as $charset) {

// 设置字符集,以显示它对某些值的影响(例如,以字节为单位的长度)
mysqli_set_charset($link, $charset);

$query = "SELECT actor_id, last_name from actor ORDER BY actor_id";

echo
"======================\n";
echo
"字符集: $charset\n";
echo
"======================\n";

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

/* 获取所有列的字段信息 */
$finfo = mysqli_fetch_fields($result);

foreach (
$finfo as $val) {
printf("名称: %s\n", $val->name);
printf("表: %s\n", $val->table);
printf("最大长度: %d\n", $val->max_length);
printf("长度: %d\n", $val->length);
printf("charsetnr: %d\n", $val->charsetnr);
printf("标识: %d\n", $val->flags);
printf("类型: %d\n\n", $val->type);
}
mysqli_free_result($result);
}
}

mysqli_close($link);
?>

以上示例将输出

======================
Character Set: latin1
======================
Name:      actor_id
Table:     actor
Max. Len:  3
Length:    5
charsetnr: 63
Flags:     49699
Type:      2

Name:      last_name
Table:     actor
Max. Len:  12
Length:    45
charsetnr: 8
Flags:     20489
Type:      253

======================
Character Set: utf8
======================
Name:      actor_id
Table:     actor
Max. Len:  3
Length:    5
charsetnr: 63
Flags:     49699
Type:      2

Name:      last_name
Table:     actor
Max. Len:  12
Length:    135
charsetnr: 33
Flags:     20489

另请参见

添加说明

用户贡献的说明 6 条说明

17
AndrewRoz
13 年前
MySql 使用的字段信息位标志为
(感谢 hotmail 点 com 上的 ragtag)
<?php
/*
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
*/

// 要测试是否设置了标志,可以使用 &,如下所示:

$meta = $mysqli_result_object->fetch_field();
if (
$meta->flags & 4) {
echo
'唯一键标志已设置';
}
?>
6
mccharles 点 craven at 点点 gov
7 年前
希望将此函数中的 'type' 字段映射到 mysqli_stmt_bind_param 中使用,或者将其用于自己的映射的人可能会发现此函数很有用。

function map_field_type_to_bind_type($field_type)
{
switch ($field_type)
{
case MYSQLI_TYPE_DECIMAL
case MYSQLI_TYPE_NEWDECIMAL
case MYSQLI_TYPE_FLOAT
case MYSQLI_TYPE_DOUBLE
return 'd';

case MYSQLI_TYPE_BIT
case MYSQLI_TYPE_TINY
case MYSQLI_TYPE_SHORT
case MYSQLI_TYPE_LONG
case MYSQLI_TYPE_LONGLONG
case MYSQLI_TYPE_INT24
case MYSQLI_TYPE_YEAR
case MYSQLI_TYPE_ENUM
return 'i';

case MYSQLI_TYPE_TIMESTAMP
case MYSQLI_TYPE_DATE
case MYSQLI_TYPE_TIME
case MYSQLI_TYPE_DATETIME
case MYSQLI_TYPE_NEWDATE
case MYSQLI_TYPE_INTERVAL
case MYSQLI_TYPE_SET
case MYSQLI_TYPE_VAR_STRING
case MYSQLI_TYPE_STRING
case MYSQLI_TYPE_CHAR
case MYSQLI_TYPE_GEOMETRY
return 's';

case MYSQLI_TYPE_TINY_BLOB
case MYSQLI_TYPE_MEDIUM_BLOB
case MYSQLI_TYPE_LONG_BLOB
case MYSQLI_TYPE_BLOB
return 'b';

default
trigger_error("未知类型: $field_type");
return 's';
}
}
5
andre at koethur 点 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);
}

?>
4
educarme at adinet 点 com 点 uy
10 年前
fetch_fields() 返回的数据类型代码

名称 代码
tinyint_ 1
boolean_ 1
smallint_ 2
int_ 3
float_ 4
double_ 5
real_ 5
timestamp_ 7
bigint_ 8
serial 8
mediumint_ 9
date_ 10
time_ 11
datetime_ 12
year_ 13
bit_ 16
decimal_ 246
text_ 252
tinytext_ 252
mediumtext_ 252
longtext_ 252
tinyblob_ 252
mediumblob_ 252
blob_ 252
longblob_ 252
varchar_ 253
varbinary_ 253
char_ 254
binary_ 254
0
cz 点 paranoiq at gmail 点 com
9 年前
MySQL 源代码中的完整标志列表

NOT_NULL_FLAG 1 /* 字段不能为空 */
PRI_KEY_FLAG 2 /* 字段是主键的一部分 */
UNIQUE_KEY_FLAG 4 /* 字段是唯一键的一部分 */
MULTIPLE_KEY_FLAG 8 /* 字段是键的一部分 */
BLOB_FLAG 16 /* 字段是 blob */
UNSIGNED_FLAG 32 /* 字段无符号 */
ZEROFILL_FLAG 64 /* 字段为 zerofill */
BINARY_FLAG 128 /* 字段为二进制 */
ENUM_FLAG 256 /* 字段为枚举 */
AUTO_INCREMENT_FLAG 512 /* 字段为自动递增字段 */
TIMESTAMP_FLAG 1024 /* 字段为时间戳 */
SET_FLAG 2048 /* 字段为集合 */
NO_DEFAULT_VALUE_FLAG 4096 /* 字段没有默认值 */
ON_UPDATE_NOW_FLAG 8192 /* 更新时将字段设置为 NOW */
NUM_FLAG 32768 /* 字段为数字(用于客户端) */
PART_KEY_FLAG 16384 /* 内部;部分键 */
GROUP_FLAG 32768 /* 内部:分组字段 */
UNIQUE_FLAG 65536 /* 内部:由 sql_yacc 使用 */
BINCMP_FLAG 131072 /* 内部:由 sql_yacc 使用 */
GET_FIXED_FIELDS_FLAG (1 << 18) /* 用于获取项目树中的字段 */
FIELD_IN_PART_FUNC_FLAG (1 << 19)/* 字段是分区函数的一部分 */
-2
attand at gmail dot com
6 年前
nax_length 以字节为单位计算。因此,如果文本是 utf-8,则会得到错误的结果。

我们有一个代码片段,用于检查字段的最大长度和存储数据的最大长度是否相等。这样,我们可以检查插入数据的潜在截断。
To Top