ODBC (Open Database Connectivity) 提供統一介面存取不同資料庫(MSSQL、Access、MySQL、PostgreSQL 等)。PHP ODBC 擴展需安裝 php-odbc 並啟用 extension=odbc。現代專案建議改用 PDO_ODBC 或原生 PDO 驅動。
| 函式 | 說明 |
odbc_fetch_row(result, row_num) | 移動到指定行(1-based),回傳 bool |
odbc_fetch_array(result, row_num) | 取得關聯+數字索引陣列 |
odbc_fetch_object(result, row_num) | 取得物件 |
odbc_fetch_into(result, &array, row_num) | 取得數字索引陣列(參考傳遞) |
odbc_result(result, field) | 取得單一欄位值(欄位名或索引) |
odbc_result_all(result, format) | 輸出 HTML 表格(除錯用) |
odbc_free_result(result) | 釋放結果集資源 |
odbc_num_rows(result) | 取得行數(部分驅動不支援) |
odbc_num_fields(result) | 取得欄位數 |
| 函式 | 說明 |
odbc_tables(conn, qualifier, owner, name, type) | 列出資料表 |
odbc_columns(conn, qualifier, owner, table, column) | 列出欄位定義 |
odbc_columnprivileges(conn, qualifier, owner, table, column) | 欄位權限 |
odbc_primarykeys(conn, qualifier, owner, table) | 主鍵欄位 |
odbc_foreignkeys(conn, pk_qualifier, pk_owner, pk_table, fk_qualifier, fk_owner, fk_table) | 外鍵關係 |
odbc_procedures(conn, qualifier, owner, name) | 預存程序 |
odbc_procedurecolumns(conn, qualifier, owner, proc, column) | 程序參數 |
odbc_statistics(conn, qualifier, owner, table, unique, accuracy) | 索引/統計資訊 |
odbc_tableprivileges(conn, qualifier, owner, name) | 資料表權限 |
odbc_specialcolumns(conn, type, qualifier, owner, table, scope, nullable) | 特殊欄位(ROWID、最佳行識別欄位) |
odbc_gettypeinfo(conn, type) | 資料類型對應表 |
四、欄位屬性函式
| 函式 | 說明 |
odbc_field_name(result, index) | 欄位名稱(1-based 索引) |
odbc_field_type(result, index) | 資料類型字串 |
odbc_field_len(result, index) | 欄位長度 |
odbc_field_precision(result, index) | 精確度(數值類型) |
odbc_field_scale(result, index) | 小數位數 |
odbc_field_num(result, name) | 欄位索引(1-based) |
五、錯誤處理
| 函式 | 說明 |
odbc_error(conn) | 最後錯誤 SQLSTATE 代碼 |
odbc_errormsg(conn) | 最後錯誤訊息 |
六、其他設定
| 函式 | 說明 |
odbc_longreadlen(result, length) | 設定 LONG/TEXT 欄位最大讀取長度(預設 4096) |
odbc_binmode(result, mode) | 二進位資料模式:ODBC_BINMODE_PASSTHRU/RETURN/CONVERT |
odbc_setoption(conn, function, option, param) | 底層驅動選項設定 |
odbc_next_result(result) | 檢查是否有下一個結果集(多重結果) |
odbc_cursor(result) | 取得游標名稱 |
完整範例:查詢 MSSQL
<?php
// 連線
$conn = odbc_connect("Driver={ODBC Driver 17 for SQL Server};Server=192.168.1.10;Database=test;", 'sa', 'password');
if (!$conn) {
die("連線失敗: " . odbc_errormsg());
}
// 執行查詢
$sql = "SELECT id, name, email FROM users WHERE status = ?";
$stmt = odbc_prepare($conn, $sql);
if (!$stmt) die("預備失敗: " . odbc_errormsg($conn));
$params = ['active'];
if (!odbc_execute($stmt, $params)) {
die("執行失敗: " . odbc_errormsg($conn));
}
// 讀取結果
$results = [];
while (odbc_fetch_row($stmt)) {
$results[] = [
'id' => odbc_result($stmt, 'id'),
'name' => odbc_result($stmt, 'name'),
'email' => odbc_result($stmt, 'email'),
];
}
odbc_free_result($stmt);
odbc_close($conn);
print_r($results);
?>
現代替代方案建議
| 方案 | 優點 | 適用場景 |
| PDO_ODBC | 統一 PDO 介面、參數綁定更安全、支援交易、例外處理 | 新專案、需跨資料庫 |
| PDO_SQLSRV / PDO_DBLIB | 原生 MSSQL 驅動、效能更好、支援新功能 | 專用 MSSQL 專案 |
| ADOdb | 資料庫抽象層、快取、Active Record、支援多種 DB | 舊專案遷移、需快速開發 |
| Doctrine DBAL | 強大 SQL 建構器、Schema 管理、型別映射 | 現代框架專案 |
常見問題
- 中文亂碼: 確保連線字串含
CharacterSet=UTF-8,資料庫欄位為 NVARCHAR,PHP 腳本為 UTF-8。
odbc_num_rows() 回傳 -1:部分驅動不支援,改用 SELECT COUNT(*) 或迴圈計數。
- 長文字截斷: 執行前呼叫
odbc_longreadlen($result, 1000000)。
- 64 位元系統: 需安裝 64 位元 ODBC 驅動程式,並用 64 位元 PHP。
- 上一篇文章: PHP func_num_args/func_get_args/func_get_arg 可變參數函式完整指南</x2Title>
<xTitle>PHP func_num_args/func_get_args/func_get_arg 可變參數函式完整指南
- 下一篇文章: PHP Stream 函式完整分類參考:上下文、過濾器、Socket、封裝協議
Copyright ©
程式碼之家 All Rights Reserved