首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 獲取 MySQL 資料表欄位名稱:mysql_list_fields 與現代替代方案

     編輯:PHP 綜合知識

PHP 獲取資料表欄位名稱的方法演進

早期 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',...

現代方案一:PDO(推薦)

<?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);
// 同樣處理輸出

現代方案二:MySQLi(程序風格)

<?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));

現代方案三:MySQLi(物件風格,獲取完整欄位資訊)

<?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 / DESCRIBEMySQL 原生、速度快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";
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved