在PHP 中,當我們使用擴展操作數據庫時,有時候不僅需要獲取查詢結果本身,還需要了解查詢返回字段的詳細信息,例如字段名稱、類型、長度等。這些信息被稱為字段的元數據(metadata) 。
本文將通過一個具體示例,講解如何用mysqli::stmt_init結合prepare()和result_metadata()方法獲取數據庫字段的元數據。
首先,我們需要用mysqli類連接到數據庫。
<?php
$mysqli = new mysqli('localhost', 'username', 'password', 'database');
if ($mysqli->connect_errno) {
die('連接失敗: ' . $mysqli->connect_error);
}
?>
接下來,我們使用stmt_init()初始化一個mysqli_stmt對象,並用prepare()方法準備一條SQL 查詢語句。
<?php
$stmt = $mysqli->stmt_init();
if (!$stmt->prepare('SELECT id, name, email FROM users WHERE status = ?')) {
die('預處理失敗: ' . $stmt->error);
}
?>
假設我們要查詢status = 'active'的用戶:
<?php
$status = 'active';
$stmt->bind_param('s', $status);
if (!$stmt->execute()) {
die('執行失敗: ' . $stmt->error);
}
?>
現在,重點來了—— 我們調用result_metadata()方法獲取查詢結果的字段元數據。
<?php
$metadata = $stmt->result_metadata();
if ($metadata) {
while ($field = $metadata->fetch_field()) {
echo "字段名: " . $field->name . "<br>";
echo "字段類型: " . $field->type . "<br>";
echo "最大長度: " . $field->max_length . "<br>";
echo "<hr>";
}
$metadata->free();
} else {
echo "沒有元數據可用。";
}
?>
這裡, fetch_field()會返回一個包含字段詳細信息的對象,常用屬性包括:
name → 字段名稱
type → 字段類型(數字代碼,需對照手冊)
max_length → 字段的最大長度(注意:只對結果集生效)
最後,不要忘記釋放語句和關閉數據庫連接:
<?php
$stmt->close();
$mysqli->close();
?>
假設查詢返回了三個字段id , name , email ,輸出可能如下:
字段名: id
字段類型: 3
最大長度: 0
-----------------------
字段名: name
字段類型: 253
最大長度: 0
-----------------------
字段名: email
字段類型: 253
最大長度: 0
注意,字段類型的數字值需要參考MySQL 手冊的類型常量,比如3代表MYSQLI_TYPE_LONG , 253代表MYSQLI_TYPE_VAR_STRING 。