在 PHP 開發中,經常需要動態獲取 MySQL 數據表的結構信息,例如字段名稱、字段長度、數據類型、主鍵約束等元數據。這在構建通用的數據庫管理工具、自動生成代碼、數據字典文檔等場景中非常實用。本文將系統介紹如何使用 PHP 獲取 MySQL 表結構的各類信息。
首先建立數據庫連接,這是所有後續操作的基礎:
$hostname = "localhost";
$username = "root";
$password = "";
$link = mysql_connect($hostname, $username, $password);
mysql_select_db("your_database", $link);
使用 mysql_list_dbs() 可以列出服務器上的所有數據庫:
$db_list = mysql_list_dbs($link);
$rows = mysql_num_rows($db_list);
for ($i = 0; $i < $rows; $i++) {
echo mysql_db_name($db_list, $i) . "
";
}
通過 mysql_fetch_lengths() 可以獲得查詢結果中每個字段的實際長度:
$sql = "SELECT * FROM friends WHERE id = 1";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
$lengths = mysql_fetch_lengths($result);
for ($i = 0; $i < count($lengths); $i++) {
echo "第 {$i} 列的長度為:" . $lengths[$i] . "
";
}
使用 mysql_fetch_field() 可以獲取字段的詳細屬性信息:
$result = mysql_query("SELECT * FROM friends");
$field_count = mysql_num_fields($result);
for ($i = 0; $i < $field_count; $i++) {
$meta = mysql_fetch_field($result, $i);
if (!$meta) {
echo "無可用信息
";
continue;
}
echo "";
echo "字段名: {$meta->name}\n";
echo "表名: {$meta->table}\n";
echo "類型: {$meta->type}\n";
echo "最大長度: {$meta->max_length}\n";
echo "是否主鍵: " . ($meta->primary_key ? '是' : '否') . "\n";
echo "是否唯一鍵: " . ($meta->unique_key ? '是' : '否') . "\n";
echo "是否非空: " . ($meta->not_null ? '是' : '否') . "\n";
echo "是否數值型: " . ($meta->numeric ? '是' : '否') . "\n";
echo "是否Blob: " . ($meta->blob ? '是' : '否') . "\n";
echo "是否無符號: " . ($meta->unsigned ? '是' : '否') . "\n";
echo "是否補零: " . ($meta->zerofill ? '是' : '否') . "\n";
echo "";
}
mysql_field_flags() 返回字段的標誌信息,如 primary_key、not_null、auto_increment 等:
$flags = mysql_field_flags($result, 0);
$flag_array = explode(" ", $flags);
print_r($flag_array);
使用 mysql_field_name() 可以按索引獲取字段名稱:
$result = mysql_query("SELECT * FROM friends");
for ($i = 0; $i < 5; $i++) {
$name = mysql_field_name($result, $i);
echo "第 " . ($i + 1) . " 個字段名稱:" . $name . "
";
}
推薦使用 PDO 或 MySQLi 的現代 API:
// PDO 方式獲取字段信息
$pdo = new PDO("mysql:host=localhost;dbname=test", "root", "");
$stmt = $pdo->query("SELECT * FROM friends LIMIT 1");
for ($i = 0; $i < $stmt->columnCount(); $i++) {
$meta = $stmt->getColumnMeta($i);
print_r($meta);
}