PHP Conference Japan 2024

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

物件屬性
屬性 描述
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 Code LIMIT 5";

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

/* 取得所有欄位的欄位資訊 */
while ($finfo = $result->fetch_field()) {

printf("名稱:%s\n", $finfo->name);
printf("表格:%s\n", $finfo->table);
printf("最大長度:%d\n", $finfo->max_length);
printf("旗標:%d\n", $finfo->flags);
printf("類型:%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("名稱: %s\n", $finfo->name);
printf("資料表: %s\n", $finfo->table);
printf("最大長度: %d\n", $finfo->max_length);
printf("旗標: %d\n", $finfo->flags);
printf("類型: %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
13 年前
以下是 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
Anonymous
12 年前
此處列舉了 fetch_field 返回的 TYPE 數字的常數 (MYSQLI_TYPE_*)。
https://php.dev.org.tw/manual/en/mysqli.constants.php
ragtag at hotmail dot com
16 年前
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
'已設定唯一鍵旗標';
}
?>
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://mysqldev.dev.org.tw/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://mysqldev.dev.org.tw/doc/internals/en/com-query-response.html#column-definition
rvila at revolutionvisualarts dot com
8 年前
函數 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 值取代。但如果此程序反向,則當 foreach 語句在旗標的數值等於目前鍵的值時設為中斷時,程式碼將選擇 TINYINT 作為第一個實例。

根據 Johnathan 在 https://php.dev.org.tw/manual/en/mysqli.field-count.php 中新增的註解,這些值應為

CHAR = 254
TINYINT = 1

但是預定義函數將值 254 指定給 MYSQLI_TYPE_STRING。

僅供參考
nick
7 年前
無法透過 fetch_fields() 取得 enum 或 set 欄位的值。據我所知,這是因為它尚未在 mysqlnd API 中實作,但無論原因為何,都無法直接取得,您必須直接發出像 SHOW COLUMNS 這樣的查詢,並檢查結果來確定它們。

順帶一提,您需要檢查 enum_flag 而不是尋找 enum_type 來判斷欄位是否為 enum。返回的類型通常是某種類型的字串。
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