mysqli_result::fetch_field_direct

mysqli_fetch_field_direct

(PHP 5、PHP 7、PHP 8)

mysqli_result::fetch_field_direct -- mysqli_fetch_field_direct获取单个字段的元数据

描述

面向对象风格

public mysqli_result::fetch_field_direct(int $index): object|false

过程化风格

mysqli_fetch_field_direct(mysqli_result $result, int $index): object|false

返回一个对象,其中包含来自指定结果集的字段定义信息。

参数

result

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

index

字段号。此值必须在 0字段数 - 1 的范围内。

返回值

返回一个包含字段定义信息的对象,如果指定的 index 没有可用字段信息,则返回 false

对象属性
属性 描述
name 列的名称
orgname 如果指定了别名,则为原始列名
table 此字段所属的表的名称(如果未计算)
orgtable 如果指定了别名,则为原始表名
def 未使用。始终为空字符串
db 数据库的名称
catalog 未使用。始终为 "def"
max_length 结果集的字段最大宽度。从 PHP 8.1 开始,此值始终为 0
length 字段的字节宽度。对于字符串列,长度值随连接字符集而变化。例如,如果字符集为 latin1(单字节字符集),则 SELECT 'abc' 查询的长度值为 3。如果字符集为 utf8mb4(多字节字符集,字符最多占用 4 个字节),则长度值为 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 Name LIMIT 5";

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

/* 获取 'SurfaceArea' 列的字段信息 */
$finfo = $result->fetch_field_direct(1);

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", $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 Name LIMIT 5";

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

/* 获取 'SurfaceArea' 列的字段信息 */
$finfo = mysqli_fetch_field_direct($result, 1);

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", $finfo->type);

mysqli_free_result($result);
}

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

上面的示例将输出

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

参见

添加笔记

用户贡献的笔记 12 个笔记

16
daniel at summit cove dot com
15 年前
以下是一个更大的数据类型列表。我通过创建所有可能的类型并调用 fetch_fields() 获取了这些类型。

<?php
$mysql_data_type_hash
= array(
1=>'tinyint',
2=>'smallint',
3=>'int',
4=>'float',
5=>'double',
7=>'timestamp',
8=>'bigint',
9=>'mediumint',
10=>'date',
11=>'time',
12=>'datetime',
13=>'year',
16=>'bit',
//252 is currently mapped to all text and blob types (MySQL 5.0.51a)
253=>'varchar',
254=>'char',
246=>'decimal'
);
?>
5
ben dot NOSPAM at NOSPAM dot seraphire dot com
11 年前
这可能很明显,但是字段类型的常量已经在 PHP 中定义,可以在以下文档中找到:https://php.net/manual/en/mysqli.constants.php
5
cjs at ashdowntech dot com
15 年前
根据
http://www.redferni.uklinux.net/mysql/MySQL-Protocol.html

数据类型值是

DECIMAL 0 ENUM 247
TINY 1 SET 248
SHORT 2 TINY_BLOB 249
LONG 3 MEDIUM_BLOB 250
FLOAT 4 LONG_BLOB 251
DOUBLE 5 BLOB 252
NULL 6 VAR_STRING 253
TIMESTAMP 7 STRING 254
LONGLONG 8 GEOMETRY 255
INT24 9
DATE 10
TIME 11
DATETIME 12
YEAR 13
NEWDATE 14

请注意,这尚未经过测试,也不包含
deluxmozart 指出的所有值
5
cjs at ashdowntech dot com
15 年前
根据
dev.mysql.com/sources/doxygen/mysql-5.1/mysql__com_8h-source.html
标志位是

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 /* 字段是零填充的 */
BINARY_FLAG 128 /* 字段是二进制的 */
ENUM_FLAG 256 /* 字段是枚举 */
AUTO_INCREMENT_FLAG 512 /* 字段是自动增量字段 */
TIMESTAMP_FLAG 1024 /* 字段是时间戳 */
2
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);
}

?>
1
gmx dot net at Hoffmann dot P
10 年前
警告!
此函数不仅比预期更占用内存,而且内存消耗还取决于结果集的大小。因此,如果您真的只需要获取字段名称,您可能希望附加“LIMIT 1”或使用 mysqli->unbuffered_query() 来避免内存膨胀。
1
shoresofnowhere at gmail dot com
14 年前
请注意,->def 属性永远不会被正确的默认字段值填充,因此它完全是无用的。

这并非由于 php 中的错误(因此不要提交错误报告),而是出于设计原因,因为 MySQL C API 调用不会填充此值,除非您调用 mysql_list_fields() 函数,而 Php 不会调用此函数。

请参阅以下参考。
https://dev.mysqlserver.cn/doc/refman/5.0/en/c-api-datatypes.html

此外,请注意,如果您使用包含子查询的查询,则主键/自动增量标志不会传递,即使您查看的字段是主表的自动增量主键

SELECT * from (SELECT id from areas) AS subareas

您会发现 id 字段上的主键和 autoinc 标志处于关闭状态,即使 id 是 areas 表的主自动增量键。

我认为这也出于设计原因,因为假定如果我们使用子查询,那么主键/autoinc 东西可能毫无意义,因为在结果集中我们可以组合来自多个不同表的字段。

希望这有帮助,再见!
0
anatoliy at ukhvanovy dot name
9 年前
您可以在此处找到所有可用的数据类型
https://php.net/manual/ru/mysqli.constants.php
(在您的浏览器中搜索“MYSQLI_TYPE_”)
-1
Anonymous
4 年前
如果有人想知道,JSON 类型是 245。
-1
bl at example dot com
14 年前
请注意
"SELECT <timestamp-field>, ..."
将以类型 7(时间戳)返回字段,但内容类似于“2010-07-14 14:35:08”。关键是它是一个字符串。

"SELECT <timestamp-field> + 0, ..."
返回类型 5(双精度),但虽然是一个数字,但不是自纪元以来的秒数,而是在 MySQL 中的“YYYYMMDDHHMMSS”格式下的数字,在本例中为
20100714143508

(PHP 5.2.12)
-1
deluxmozart at yahoo dot de
16 年前
以下是一些数据类型的数字。我搜索过,但我没有找到一个列表,其中列出了数字的数据类型。

所以首先我可以给出这个

3 - Int
10 - Date
246 - Decimal
252 - text
253 - VarChar
254 - Boolean
-3
gcdreak at example dot com
14 年前
我编写了一个简单的类来获取有关字段的信息。
试试看!

<?php
class MysqlFieldsInfo implements Iterator
{

private
$result;
private
$position;
private
$row;


function
__construct($result){
$this->result = $result;
$this->position = 0;
$this->rewind(); // W $results wewnętrzny wskaźnik może być przesunięty więc powracamy do początku
}

public function
current(){
return
$this->row;
}

public function
next(){
$this->position++;
$this->row = $this->result->fetch_field();
}

public function
valid(){
return (boolean)
$this->row;
}

public function
key(){
return
$this->position;
}

public function
rewind(){
$this->position = 0;
$this->result->field_seek(0);
$this->next();
}

// This function show data in table
public function export(){

echo
'<table id="db_table_info">';
echo
'<tr>
<th>Name</th>
<th>Orgname</th>
<th>Table</th>
<th>Orgtable</th>
<th>Def</th>
<th>Max_length</th>
<th>Length</th>
<th>Charsetnr</th>
<th>Flags</th>
<th>Type</th>
<th>Decimals</th>
</tr>'
;
while(
$this->valid()){
echo
'<tr>';
printf("\n\t<td>%s</td>\n", $this->current()->name);
printf("\t<td>%s</td>\n", $this->current()->orgname);
printf("\t<td>%s</td>\n", $this->current()->orgtable);
printf("\t<td>%s</td>\n", $this->current()->def);
printf("\t<td>%s</td>\n", $this->current()->max_length);
printf("\t<td>%s</td>\n", $this->current()->length);
printf("\t<td>%s</td>\n", $this->current()->charsetnr);
printf("\t<td>%s</td>\n", $this->current()->flags);
printf("\t<td>%s</td>\n", $this->current()->type);
printf("\t<td>%s</td>\n", $this->current()->decimals);

echo
'</tr>';

$this->next();
}

echo
'</table>';
}
}
?>
To Top