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

PHP 列出 MySQL 資料表所有欄位與資料:mysqli 現代化實作

     編輯:PHP 相關知識

早期範例多使用已棄用的 mysql_* 函數。本文以 mysqli 預處理語句 為基礎,示範如何安全地連線資料庫、查詢資料表結構、取得所有欄位名與資料列,並輸出為 HTML 表格,附帶錯誤處理與資源釋放最佳實踐。

完整可執行範例

<?php
// 設定區(實務應從環境變數或設定檔讀取)
$host = 'localhost';
$user = 'db_user';
$pass = 'db_pass';
$dbname = 'my_database';
$table = 'domains'; // 目標資料表
$where = "sex = 'F'"; // 篩選條件,可為空字串

// 1. 建立連線
$mysqli = new mysqli($host, $user, $pass, $dbname);
if ($mysqli->connect_errno) {
    die("資料庫連線失敗 ({$mysqli->connect_errno}): {$mysqli->connect_error}");
}
$mysqli->set_charset('utf8mb4'); // 重要:設定字元集

// 2. 取得欄位資訊(用於表頭)
$fields = [];
$fieldResult = $mysqli->query("SHOW COLUMNS FROM `$table`");
if ($fieldResult) {
    while ($row = $fieldResult->fetch_assoc()) {
        $fields[] = $row['Field'];
    }
    $fieldResult->free();
}

// 3. 查詢資料(使用預處理防注入)
$sql = "SELECT * FROM `$table`";
if ($where) $sql .= " WHERE $where";

$stmt = $mysqli->prepare($sql);
if (!$stmt) {
    die("SQL 準備失敗: {$mysqli->error}");
}
$stmt->execute();
$result = $stmt->get_result();

// 4. 輸出 HTML 表格
echo '<h2>' . htmlentities($table) . ' 資料列表</h2>';
echo '<p>共 ' . $result->num_rows . ' 筆資料</p>';

if ($result->num_rows > 0) {
    echo '<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse;">';
    // 表頭
    echo '<thead><tr>';
    foreach ($fields as $field) {
        echo '<th>' . htmlentities($field) . '</th>';
    }
    echo '</tr></thead>';

    // 資料列
    echo '<tbody>';
    while ($row = $result->fetch_assoc()) {
        echo '<tr>';
        foreach ($fields as $field) {
            $val = $row[$field] ?? '';
            // 針對不同型別做簡單格式化
            if (is_null($val)) {
                $display = '<em>NULL</em>';
            } elseif (is_bool($val)) {
                $display = $val ? 'true' : 'false';
            } else {
                $display = htmlentities((string)$val, ENT_QUOTES, 'UTF-8');
            }
            echo '<td>' . $display . '</td>';
        }
        echo '</tr>';
    }
    echo '</tbody></table>';
} else {
    echo '<p>查無資料</p>';
}

// 5. 釋放資源、關閉連線
$result->free();
$stmt->close();
$mysqli->close();
?>

關鍵改進點對比

舊版 mysql_*現代 mysqli優勢
mysql_connect()new mysqli()物件導向、支援預處理、多查詢
mysql_query() 直接拼字串prepare() + bind_param()防 SQL 注入、效能更好(重複執行)
mysql_fetch_row() 數字索引fetch_assoc() 關聯陣列程式碼可讀性高、不怕欄位順序變動
無字元集設定set_charset('utf8mb4')完整支援 Emoji、多國語言
手動 mysql_free_result()物件方法 $result->free()一致性、可鏈式呼叫

進階:取得欄位完整定義(型別、長度、預設值、備註)

<?php
$fieldInfo = [];
$res = $mysqli->query("SHOW FULL COLUMNS FROM `$table`");
while ($row = $res->fetch_assoc()) {
    $fieldInfo[$row['Field']] = $row; // 包含 Type, Collation, Null, Key, Default, Extra, Privileges, Comment
}
$res->free();
// 現在 $fieldInfo['email']['Comment'] 可取得欄位備註
?>

常見問題 FAQ

  1. 欄位名有空格或保留字怎麼辦? 查詢時用反引號包裹 SELECT `order`, `group` FROM ...,或在 PHP 中 $row['`order`'] 存取。
  2. 大量資料怎麼辦? 使用 LIMIT offset, count 分頁,或改用 fetch_row() 逐行處理避免記憶體爆增。
  3. BLOB/二進位欄位怎麼顯示? 不要直接輸出,改顯示 <em>[BLOB: 12345 bytes]</em> 或提供下載連結。
  4. 怎麼只抓特定欄位? 修改 SELECT 子句,或在 PHP 迴圈中只遍歷需要的欄位陣列。

掌握 mysqli 現代寫法,不僅能列出資料表內容,更是建構所有資料庫操作功能的堅實基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved