2024 年 PHP Conference Japan

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(): 陣列

程序式風格

mysqli_fetch_fields(mysqli_result $result): 陣列

此函式與 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 欄位的寬度,以位元組為單位。對於字串欄位,長度值會根據連線字元集而有所不同。例如,如果字元集是單一位元組字元集 latin1,則 SELECT 'abc' 查詢的長度值為 3。如果字元集是多位元組字元集 utf8mb4(其中字元最多佔 4 個位元組),則長度值為 12。
charsetnr 欄位的字元集編號。
flags 表示欄位位元標記的整數。
type 此欄位使用的資料類型
decimals 數值欄位的小數位數,以及時間欄位的小數秒精度。

範例

範例 #1 物件導向風格

<?php
$mysqli
= new mysqli("127.0.0.1", "root", "foofoo", "sakila");

/* check connection */
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}

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

// Set character set, to show its impact on some values (e.g., length in bytes)
$mysqli->set_charset($charset);

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

echo
"======================\n";
echo
"Character Set: $charset\n";
echo
"======================\n";

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

/* Get field information for all columns */
$finfo = $result->fetch_fields();

foreach (
$finfo as $val) {
printf("Name: %s\n", $val->name);
printf("Table: %s\n", $val->table);
printf("Max. Len: %d\n", $val->max_length);
printf("Length: %d\n", $val->length);
printf("charsetnr: %d\n", $val->charsetnr);
printf("Flags: %d\n", $val->flags);
printf("Type: %d\n\n", $val->type);
}
$result->free();
}
}
$mysqli->close();
?>

範例 #2 程序風格

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

/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}

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

// Set character set, to show its impact on some values (e.g., length in bytes)
mysqli_set_charset($link, $charset);

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

echo
"======================\n";
echo
"Character Set: $charset\n";
echo
"======================\n";

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

/* Get field information for all columns */
$finfo = mysqli_fetch_fields($result);

foreach (
$finfo as $val) {
printf("Name: %s\n", $val->name);
printf("Table: %s\n", $val->table);
printf("Max. Len: %d\n", $val->max_length);
printf("Length: %d\n", $val->length);
printf("charsetnr: %d\n", $val->charsetnr);
printf("Flags: %d\n", $val->flags);
printf("Type: %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 則註解

AndrewRoz
13 年前
MySQL 使用的欄位資訊位元標記為
(感謝 ragtag at hotmail dot com)
<?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
'已設定唯一鍵標記';
}
?>
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);
}

?>
mccharles dot craven at dot dot gov
8 年前
對於想要將此函式中的「type」欄位映射以用於 mysqli_stmt_bind_param 或將其用於自定義映射的人來說,可能會發現此函式很有用。

函式 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
回傳 '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
回傳 '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';
}
}
educarme at adinet dot com dot 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
cz dot paranoiq at gmail dot com
9 年前
來自 MySQL 原始碼的完整旗標列表

NOT_NULL_FLAG 1 /* 欄位不可為 NULL */
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 /* 欄位是一個時間戳記 */
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)/* 欄位是分割函數的一部分 */
attand at gmail dot com
6 年前
nax_length 以位元組為單位計算。因此,如果文字是 utf-8 編碼,則會得到不正確的結果。

我們有一段程式碼,用於檢查欄位的最大長度是否與儲存資料的最大長度相等。透過這種方式,我們可以檢查插入資料的潛在截斷。
To Top