ODBC (Open Database Connectivity) 是資料庫存取的工業標準介面,PHP 提供 odbc_ 系列函式支援連接 Access、SQL Server、Excel 等多種資料源。本文整理核心函式並提供分頁查詢完整範例。
| 函式 | 用途 | 說明 |
|---|---|---|
odbc_connect(dsn, user, password) | 建立 ODBC 連線 | DSN 可為系統/使用者/檔案 DSN,或無 DSN 連線字串 |
odbc_exec(conn, query) / odbc_do() | 執行 SQL 查詢 | 回傳結果集識別碼 |
odbc_fetch_row(result, row) | 擷取下一列(或指定列) | row 參數可選,無資料回傳 false |
odbc_result(result, field) | 取得目前列指定欄位值 | 欄位可用名稱或索引 |
odbc_close(conn) | 關閉連線 | 若有開啟交易會失敗 |
odbc_num_rows(result) | 取得結果列數 | 部分驅動程式不支援 |
odbc_num_fields(result) | 取得欄位數 | |
odbc_field_name(result, index) | 取得欄位名稱 | 1 起始索引 |
<?php
// 設定每頁顯示筆數
$show_num = 10;
$spages = $pages; // 保存頁碼避免被修改
// 連線設定
$dsn = "localhost";
$user = "sa";
$password = "";
// 計算總筆數
$rs_num = "select count(*) as id from bbs where zu='0' and lei='$lei'";
$conn_id = odbc_connect($dsn, $user, $password);
$rnum = odbc_exec($conn_id, $rs_num);
$total_rs = 0;
while (odbc_fetch_row($rnum)) {
$total_rs = odbc_result($rnum, "id");
}
// 計算總頁數
$nnn = $total_rs / $show_num;
$hnnn = intval($nnn);
$cnnnn = $nnn - $hnnn;
switch ($cnnnn) {
case "0":
$hnnn++;
$nnn = $hnnn;
break;
default:
$nnn = $hnnn;
break;
}
if ($nnn == 0) $nnn++;
// 頁碼導航邏輯
$fore = $pages - 1;
$next = $pages + 1;
if ($fore > 0) {
echo "<a href=\"?pages=1\">首頁</a>";
echo "<a href=\"?pages=$fore\">前頁</a>";
}
if ($pages < $nnn) {
echo "<a href=\"?pages=$next\">後頁</a>";
echo "<a href=\"?pages=$nnn\">尾頁</a>";
}
echo "共 $nnn 頁";
// 查詢資料
$query_string = "SELECT * FROM table WHERE condition ORDER BY you_wanted_order";
$cur = odbc_exec($conn_id, $query_string);
// 移動游標到當頁起始位置
$cnum = ($pages - 1) * $show_num;
if ($cnum != 0) {
for ($i = 0; $i <= $cnum; odbc_fetch_row($cur)) { $i++; }
}
// 顯示當頁資料
$i = 1;
while (odbc_fetch_row($cur)) {
// 這裡輸出各欄位資料
// echo odbc_result($cur, "field_name");
if ($i == $show_num) break;
$i++;
}
odbc_close($conn_id);
?>
"Driver={SQL Server};Server=localhost;Database=mydb;Uid=sa;Pwd=;"範例採用「空迴圈跳過」方式定位至目標頁起始列:
for ($i = 0; $i <= $cnum; odbc_fetch_row($cur)) { $i++; }
此法在大量資料時效能較差,生產環境建議使用 SQL 端分頁(如 SQL Server 的 ROW_NUMBER() OVER() 或 OFFSET/FETCH)。
範例使用 switch 處理餘數判斷,實際可簡化為:
$total_pages = ceil($total_rs / $show_num);
odbc_connect()、odbc_exec() 回傳值odbc_error()、odbc_errormsg() 取得詳細錯誤針對特定資料庫,建議使用原生擴充功能:
sqlsrv 或 pdo_sqlsrvpdo_odbc(仍需 ODBC 驅動)PDO::ODBC 提供統一介面ODBC 雖屬通用標準,但效能與功能通常不如原生驅動,僅在無原生驅動或需跨資料庫平台時建議使用。