早期範例多使用已棄用的 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'] 可取得欄位備註
?>
SELECT `order`, `group` FROM ...,或在 PHP 中 $row['`order`'] 存取。LIMIT offset, count 分頁,或改用 fetch_row() 逐行處理避免記憶體爆增。<em>[BLOB: 12345 bytes]</em> 或提供下載連結。掌握 mysqli 現代寫法,不僅能列出資料表內容,更是建構所有資料庫操作功能的堅實基礎。