本文提供一個完整的 PHP 範例,示範如何連接 MySQL 資料庫、查詢資料並動態生成 HTML 表格。雖然範例使用較舊的 mysql_* 函數(已棄用),但邏輯清晰,適合初學者理解資料庫驅動網頁的基本流程。現代專案建議改用 PDO 或 MySQLi 並採用預處理語句以防 SQL 注入。
<?php
// 1. 建立資料庫連線
$link = mysqli_connect("localhost", "root", "123456", "bustest");
if (!$link) { die("連線失敗: " . mysqli_connect_error()); }
// 2. 查詢不重複的 name 並依 id 排序
$sql1 = "SELECT name FROM info GROUP BY name ORDER BY id ASC";
$res1 = mysqli_query($link, $sql1);
echo "<table border='1'>";
// 3. 外層迴圈:處理每個 name
while ($row1 = mysqli_fetch_assoc($res1)) {
$name = $row1["name"];
// 4. 內層查詢:取得該 name 下的所有 id
$sql2 = "SELECT id FROM info WHERE name = ? ORDER BY id ASC";
$stmt = mysqli_prepare($link, $sql2);
mysqli_stmt_bind_param($stmt, "s", $name);
mysqli_stmt_execute($stmt);
$res2 = mysqli_stmt_get_result($stmt);
// 5. 計算該 name 出現的總次數(用於 rowspan)
$sql3 = "SELECT COUNT(*) as cnt FROM info WHERE name = ?";
$stmt3 = mysqli_prepare($link, $sql3);
mysqli_stmt_bind_param($stmt3, "s", $name);
mysqli_stmt_execute($stmt3);
$row3 = mysqli_fetch_assoc(mysqli_stmt_get_result($stmt3));
$rowspan = $row3['cnt'];
$firstRow = true;
while ($row2 = mysqli_fetch_assoc($res2)) {
echo "<tr>";
echo "<td>" . htmlspecialchars($row2['id']) . "</td>";
// 只在第一行輸出 name 欄位,並設定 rowspan
if ($firstRow) {
echo "<td rowspan='$rowspan'>" . htmlspecialchars($name) . "</td>";
$firstRow = false;
}
echo "</tr>";
}
mysqli_stmt_close($stmt);
mysqli_stmt_close($stmt3);
}
echo "</table>";
mysqli_close($link);
?>
GROUP BY name 取得唯一分類名稱。COUNT(*) 算出筆數,首列輸出 <td rowspan=N> 即可垂直合併。mysqli_prepare 綁定參數,避免 SQL 注入風險。若資料量大,可考慮單次查詢搭配 PHP 端分組,或使用 JOIN、視圖簡化邏輯。生產環境務必啟用錯誤報告、採用參數化查詢、並妥善處理編碼(建議資料庫、連線、頁面統一 UTF-8)。