2024 日本 PHP 研討會

ODBC 與 DB2 函式 (PDO_ODBC)

簡介

PDO_ODBC 是一個驅動程式,它實作了 PHP 資料物件 (PDO) 介面,以便讓 PHP 能夠透過 ODBC 驅動程式或 IBM DB2 呼叫層級介面 (DB2 CLI) 程式庫存取資料庫。PDO_ODBC 目前支援三種不同「類型」的資料庫驅動程式

ibm-db2

透過免費的 DB2 express-C 用戶端,支援存取 IBM DB2 Universal Database、Cloudscape 和 Apache Derby 伺服器。

unixODBC

支援透過 unixODBC 驅動程式管理器和資料庫自身的 ODBC 驅動程式存取資料庫伺服器。

通用

提供編譯選項,可支援 PDO_ODBC 未明確支援的 ODBC 驅動程式管理器。

在 Windows 上,必須在 php.ini 中啟用 php_pdo_odbc.dll 作為擴充功能。它與 Windows ODBC 驅動程式管理器連結,以便 PHP 可以連線到任何已編錄為系統 DSN 的資料庫。

安裝

UNIX 系統上的 PDO_ODBC
  1. PDO_ODBC 包含在 PHP 原始碼中。您可以使用下列 configure 指令將 PDO_ODBC 擴充功能編譯為靜態或共用模組。

    ibm_db2

    ./configure --with-pdo-odbc=ibm-db2,/opt/IBM/db2/V8.1/
    
    要使用 ibm-db2 版本建置 PDO_ODBC,您必須事先在編譯 PDO_ODBC 的同一台機器上安裝 DB2 應用程式開發標頭檔。DB2 應用程式開發標頭檔是 DB2 伺服器中的一個可安裝選項,也可以作為 DB2 應用程式開發用戶端的一部分,可從 IBM developerWorks » 網站 免費下載。

    如果您沒有在 configure 指令中提供 DB2 程式庫和標頭檔的位置,PDO_ODBC 預設為 /home/db2inst1/sqllib

    unixODBC

    ./configure --with-pdo-odbc=unixODBC,/usr/local
    
    如果您沒有在 configure 指令中提供 unixODBC 程式庫和標頭檔的位置,PDO_ODBC 預設為 /usr/local

    通用
    ./configure --with-pdo-odbc=generic,/usr/local,libname,ldflags,cflags
    

預先定義的常數

以下常數由此驅動程式定義,並且僅在擴充功能已編譯到 PHP 中或在執行階段動態載入時才可用。此外,這些驅動程式專用常數應僅在您使用此驅動程式時使用。將驅動程式專用屬性與其他驅動程式一起使用可能會導致非預期的行為。可以使用 PDO::getAttribute() 來取得 PDO::ATTR_DRIVER_NAME 屬性以檢查驅動程式,如果您的程式碼可以針對多個驅動程式執行。

PDO_ODBC_TYPE (字串)

PDO::ODBC_ATTR_USE_CURSOR_LIBRARY (整數)
Pdo\Odbc::ATTR_USE_CURSOR_LIBRARY 的別名。
PDO::ODBC_SQL_USE_IF_NEEDED (整數)
Pdo\Odbc::SQL_USE_IF_NEEDED 的別名。
PDO::ODBC_SQL_USE_DRIVER (整數)
Pdo\Odbc::SQL_USE_DRIVER 的別名。
PDO::ODBC_SQL_USE_ODBC (整數)
Pdo\Odbc::SQL_USE_ODBC 的別名。
PDO::ODBC_ATTR_ASSUME_UTF8 (布林值)
Pdo\Odbc::ATTR_ASSUME_UTF8 的別名。

執行階段設定

這些函式的行為受 php.ini 中的設定影響。

PDO_ODBC 設定選項
名稱 預設值 可變更性 變更記錄
pdo_odbc.connection_pooling "strict" INI_ALL  
pdo_odbc.db2_instance_name NULL INI_SYSTEM 這個已棄用的功能在未來一定會被移除
關於 INI_* 模式更進一步的細節和定義,請參閱 設定值可設定的位置

以下是配置指令的簡短說明。

pdo_odbc.connection_pooling 字串

是否要池化 ODBC 連線。可以是 "strict""relaxed""off"(等同於 "")其中之一。此參數描述連線管理器在將連線參數與現有的池化連線進行匹配時應採取的嚴格程度。建議的預設值為 strict,這將僅在所有連線參數完全匹配時才會使用快取的連線。relaxed 將在使用相似連線參數時使用快取的連線。這可以增加快取的使用率,但存在連線資訊在(例如)虛擬主機之間洩漏的風險。

此設定只能從 php.ini 檔案更改,並且會影響整個行程;載入到行程中使用相同 ODBC 函庫的任何其他模組也會受到影響,包括 Unified ODBC 擴充套件

警告

基於安全考量,不應在共用伺服器上使用 relaxed 匹配。

提示

除非您有充分的理由更改,否則請將此設定保留為預設值 strict

pdo_odbc.db2_instance_name 字串

如果您使用 db2 風格編譯 PDO_ODBC,此設定會在 Linux 和 UNIX 作業系統上將 DB2INSTANCE 環境變數的值設定為指定的 DB2 執行個體名稱。這讓 PDO_ODBC 可以解析 DB2 函庫的位置,並建立與 DB2 資料庫的目錄化連線。

此設定只能從 php.ini 檔案更改,並且會影響整個行程;載入到行程中使用相同 ODBC 函庫的任何其他模組也會受到影響,包括 Unified ODBC 擴充套件

此設定對 Windows 無效。

目錄

新增註釋

使用者貢獻的註釋 5 則註釋

tuomas
15 年前
如果您想避免安裝 DB2 Connect 和/或 PECL 模組 ibm_db2 和 PDO_IBM,您也可以透過 unixODBC 使用 IBM DB2 資料庫。

如果您在 i 伺服器上擁有 DB2 資料庫,則需要安裝 IBM iAccess (http://www.ibm.com/systems/i/software/access/linux/index.html) 和 unixODBC。只需安裝函庫 (rpm) 並修改 /etc/odbcinst.ini(範例設定位於 /opt/ibm/iSeriesAccess/unixodbcregistration)和 /etc/odbc.ini 中的設定。

根據我的經驗,這比安裝 DB2 Connect 更容易。
ChristianF
8 年前
我剛花了幾個小時試圖找出「找不到驅動程式」的例外狀況。儘管已安裝 ODBC 和 PDO_ODBC,而且所有設定似乎都正確,但還是發生了這個例外狀況。

原來問題出在我在 dsn 中使用了大寫的 ODBC。只要將 dns 改成 "odbc:database" 就行了。

由於這段程式碼幾個月前還能正常運作,這個突如其來的區分大小寫問題讓我有點困惑。所以如果你遇到這個錯誤,請先檢查大小寫。
ethan dot nelson at ltd dot org
16 年前
使用 SQL 2005、PDO_ODBC 和 datetime 欄位簡直是個痛苦的折磨。MSDN 上關於 CAST 和 CONVERT 的文件顯示,字元類型和 datetime 類型之間應該可以隱式轉換。這在一般情況下是對的……直到你把它放在預存程序中並使用變數宣告。

例如,以下程式碼會失敗

declare @date varchar;
SET @date = '20080101';
SELECT cast(@date AS datetime) AS poo

而以下程式碼會成功
declare @date varchar(19);
SET @date = '20080101';
SELECT cast(@date AS datetime) AS poo

PDO 驅動程式似乎嘗試進行隱式轉換,因此每當你嘗試將資料插入 datetime 欄位類型時,它都會失敗。

因此,要解決 SQL 中的這個問題,請宣告一個具有明確寬度的字元欄位類型。這樣你的隱式類型轉換就會成功。
Ariz Jacinto
12 年前
在 Linux 上使用 SQL Server Native Client 11.0 作為 PDO_ODBC 驅動程式

下載適用於 Linux 的 SQL Server Native Client 11.0 ODBC 驅動程式
http://www.microsoft.com/download/en/details.aspx?id=28160

設定 ODBC

/usr/local/etc/odbcsys.ini
--
[SQL Server Native Client 11.0]
Description = 適用於 Linux 的 Microsoft SQL Server ODBC 驅動程式 V1.0
Driver = /opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1720.0
UsageCount = 1

/usr/local/etc/odbc.ini
--
[MSSQLServer]
Driver = SQL Server Native Client 11.0
Description = 範例資料庫
Trace = Yes
Server =
Port = 1433
Database =

測試連線
mssqltest.php
--
<?php
putenv
('ODBCSYSINI=/usr/local/etc');
putenv('ODBCINI=/usr/local/etc/odbc.ini');
$username = "";
$password = "";
try {
$dbh = new PDO("odbc:MSSQLServer",
"$username",
"$password"
);
} catch (
PDOException $exception) {
echo
$exception->getMessage();
exit;
}
echo
var_dump($dbh);
unset(
$dbh);
?>
harry dot forum at p-boss dot com
14 年前
MSSQL - 在 Apache 上運行的 PHP - Linux Redhat

使用 php 5.2.10 時請注意以下錯誤

http://bugs.php.net/bug.php?id=42068

標準的 odbc_connect 無法運作,您必須使用 pdo_odbc

使用 pdo odbc 連線到 MSSQL - 步驟說明..

1. 下載並使用 with-unixodbc 設定 FreeTDS

./configure --prefix=/opt/SYSfreetds --with-unixodbc

make;make test; make install

2. 安裝 php-odbc 和 unixODBC

php-odbc-5.2.10-1.x86_64.rpm
unixODBC.x86_64.x86x64

3. 設定 ODBC 連結

a)
建立一個名為 tds.driver 的檔案,內容如下:

[FreeTDS]
Description = v0.63 with protocol v8.0
Driver = /opt/SYSfreetds/lib/libtdsodbc.so

註冊 ODBC 驅動程式 - tds.driver 檔案

odbcinst -i -d -f tds.driver

b)
建立一個名為 tds.datasource 的檔案 - ODBC 資料來源,內容如下:

[SOURCENAME]
Driver=FreeTDS
Description=使用 FreeTDS 測試 MS SQL 資料庫
Trace=No
Server=BobTheServer
Port=1433
TDS Version=8.0
Database=youDBname

註冊 ODBC 資料來源

odbcinst -i -s -f tds.datasource

請注意,odbc.ini 檔案將會安裝在目前使用者的家目錄中。如果您使用的是網頁伺服器,例如 Apache,則可能需要特別留意,因為 Apache 的家目錄可能不同。

請確認 .odbc.ini 位於 Apache 的家目錄中,例如 "/var/www"

4. 在命令列上測試 ODBC 連結

isql -v SOURCENAME '使用者名稱' '密碼'

+---------------------------------------+
| 連線成功! |
| |
| SQL 陳述式 |
| help [表格名稱] |
| quit |
| |
+---------------------------------------+
SQL>

5. 編輯 /etc/php.ini

確認已設定以下內容:
mssql.secure_connection = On


6. 重新啟動 Apache (優雅地)

7. 執行的 PHP 程式碼

<?
$dbh= new PDO('odbc:SOURCENAME', '使用者名稱', '密碼');
$stmt = $dbh->prepare("$query");
$stmt->execute();
while ($row = $stmt->fetch()) {
print_r($row);
}
unset($dbh); unset($stmt);
?>

問題排解

如果您遇到問題,請嘗試使用 strace/truss。可能是您在某處參考了錯誤的程式庫。

請確認在 odbc 檔案設定完成後,已重新啟動 Apache。
To Top