基本範例 (PDO 現代寫法)
PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
$stmt = $pdo->query('SELECT id, name, url FROM mclass');
$rows = $stmt->fetchAll(); // 直接取得二維陣列
$cols = 3; // 每列欄數
echo '';
for ($i = 0; $i < count($rows); $i += $cols) {
echo '';
for ($j = 0; $j < $cols && isset($rows[$i+$j]); $j++) {
$row = $rows[$i+$j];
echo '| '
. htmlspecialchars($row['name']) . ' | ';
}
echo '
';
}
echo '
';
} catch (PDOException $e) {
error_log('DB Error: ' . $e->getMessage());
echo '資料庫連線失敗,請稍後再試';
}
進階:分頁 + 表格輸出
query('SELECT COUNT(*) FROM mclass')->fetchColumn();
$totalPages = ceil($total / $perPage);
// 當頁資料
$offset = ($page - 1) * $perPage;
$stmt = $pdo->prepare('SELECT id, name, url FROM mclass LIMIT :offset, :limit');
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->bindValue(':limit', $perPage, PDO::PARAM_INT);
$stmt->execute();
$rows = $stmt->fetchAll();
// 輸出表格
echo '';
// 分頁導航
echo '';
關鍵差異:舊 mysql_* vs PDO
| 項目 | mysql_* (已移除) | PDO (推薦) |
| PHP 版本 | ≤ 5.6 | 5.1+ |
| SQL 注入防護 | 手動 escape | 預備語句 |
| 資料庫抽象 | 無 | 支援 12+ 驅動 |
| 錯誤處理 | 回傳 false | 例外模式 |
| fetchAll 直接得陣列 | 需迴圈手動建 | 一行搞定 |
安全性提醒
- 輸出 HTML 必經
htmlspecialchars()
- URL 參數經
urlencode()
- 資料庫帳號最小權限、非 root
- 錯誤訊息勿顯示給使用者
- 上一篇文章: PHP GD 繪製 3D 餅圖完整程式碼教學
- 下一篇文章: PHP + MySQL 分頁機制效能比較:LIMIT vs 游標位移
Copyright ©
程式碼之家 All Rights Reserved