早期 PHP 使用 mysql_list_fields() 獲取欄位資訊,但 mysql_* 系列函數已於 PHP 7.0 移除。本文展示舊代碼遷移至 PDO/MySQLi 的現代寫法。
<?php
$link = mysql_connect('localhost', 'username', 'password');
$fields = mysql_list_fields("database", "table", $link);
$columns = mysql_num_fields($fields);
$field = '';
for ($i = 0; $i < $columns; $i++) {
$field .= "'" . mysql_field_name($fields, $i) . "',";
}
print $field; // 輸出:'id','name','email',...
<?php
$pdo = new PDO(
"mysql:host=localhost;dbname=database;charset=utf8mb4",
'username',
'password',
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
// 方法 1:查詢 INFORMATION_SCHEMA(標準 SQL,跨資料庫通用)
$stmt = $pdo->prepare("
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?
ORDER BY ORDINAL_POSITION
");
$stmt->execute(['database', 'table']);
$columns = $stmt->fetchAll(PDO::FETCH_COLUMN);
echo implode(',', array_map(fn($c) => "'{$c}'", $columns));
// 輸出:'id','name','email',...
// 方法 2:DESCRIBE / SHOW COLUMNS(MySQL 專用,較快)
$stmt = $pdo->query("DESCRIBE `database`.`table`");
$columns = $stmt->fetchAll(PDO::FETCH_COLUMN);
// 同樣處理輸出
<?php
$mysqli = new mysqli('localhost', 'username', 'password', 'database');
$mysqli->set_charset('utf8mb4');
$result = $mysqli->query("SHOW COLUMNS FROM `table`");
$columns = [];
while ($row = $result->fetch_assoc()) {
$columns[] = $row['Field'];
}
echo implode(',', array_map(fn($c) => "'{$c}'", $columns));
<?php
$mysqli = new mysqli('localhost', 'username', 'password', 'database');
$result = $mysqli->query("SELECT * FROM `table` LIMIT 0"); // 不取資料,只取結構
$meta = $result->fetch_fields();
$columns = [];
foreach ($meta as $field) {
$columns[] = [
'name' => $field->name,
'type' => $field->type,
'length' => $field->length,
'flags' => $field->flags,
'default' => $field->def,
];
}
print_r($columns);
| 方法 | 優點 | 缺點 | 推薦場景 |
|---|---|---|---|
| INFORMATION_SCHEMA | 標準 SQL、資訊完整、跨資料庫 | 較慢、需權限 | 通用工具、遷移腳本 |
| SHOW COLUMNS / DESCRIBE | MySQL 原生、速度快 | MySQL 專用 | 高頻呼叫、MySQL 專案 |
| PDO fetch_fields() | 物件導向、型別資訊豐富 | 需先查詢(可 LIMIT 0) | 需要型別/長度等詳細資訊 |
function getTableColumns(PDO $pdo, string $table, string $schema = null): array {
$sql = "SELECT COLUMN_NAME, DATA_TYPE, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_KEY, EXTRA
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = ?";
$params = [$table];
if ($schema) {
$sql .= " AND TABLE_SCHEMA = ?";
$params[] = $schema;
}
$sql .= " ORDER BY ORDINAL_POSITION";
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
// 使用
$columns = getTableColumns($pdo, 'users', 'my_database');
foreach ($columns as $col) {
echo "{$col['COLUMN_NAME']} ({$col['COLUMN_TYPE']}) " . ($col['COLUMN_KEY'] === 'PRI' ? '[PK]' : '') . "\n";
}