PDO (PHP Data Objects) 提供統一的資料庫存取介面。連線 Microsoft SQL Server 需使用 PDO_DBLIB 驅動(基於 FreeTDS)。本文記錄在 Linux 環境下編譯安裝並驗證連線的完整步驟。
yum install freetds-develwget https://pecl.php.net/get/PDO_DBLIB
# 若連結失效,可至 https://pecl.php.net/package/PDO_DBLIB 下載最新 tgz
/usr/bin/pear install PDO_DBLIB-1.0.tgz
# 成功後會在擴充模組目錄產生 pdo_dblib.so
# 64位系統通常在 /usr/lib64/php/modules/
# 32位系統在 /usr/lib/php/modules/
echo "extension=pdo_dblib.so" > /etc/php.d/pdo_dblib.ini
# 或直接編輯 php.ini 加入上述行
service httpd restart
# 或 systemctl restart httpd (CentOS 7+)
# 或 systemctl restart php-fpm (若使用 PHP-FPM)
php -m | grep pdo_dblib
# 應輸出 pdo_dblib
<?php
try {
$dsn = "dblib:host=192.168.1.100;dbname=TestDB;charset=UTF-8";
$db = new PDO($dsn, "sa", "YourStrongPassword");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT COUNT(*) AS cnt FROM testTable";
$stmt = $db->query($sql);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
print_r($row);
}
$stmt = null;
$db = null;
echo "連線成功!";
} catch (PDOException $e) {
die("連線失敗: " . $e->getMessage());
}
?>
| 現象 | 可能原因 | 解決方向 |
|---|---|---|
| could not find driver | pdo_dblib.so 未載入 | 確認 php.ini 載入順序、重啟 php-fpm/httpd |
| SQLSTATE[HY000] Adaptive Server connection failed | FreeTDS 設定或網路不通 | 檢查 /etc/freetds/freetds.conf 伺服器定義、防火牆 1433 埠 |
| 字元集亂碼 | DSN 缺少 charset 參數 | DSN 加入 ;charset=UTF-8 或 ;charset=CP936 |
sqlsrv / pdo_sqlsrv (Microsoft 官方驅動),效能與相容性優於 FreeTDS 架構。;port=1433 明確指定埠號。PDO::ATTR_PERSISTENT => true (視負載評估)。PDO_DBLIB 是 Linux 平台連線 SQL Server 的經典方案,安裝流程固定。掌握編譯安裝與 DSN 設定細節,能快速落地 PHP 應用與 SQL Server 的整合。