在 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。