環境需求
- PHP 7.0+
- 安裝 `pdo_dblib` 擴充 (Linux: `php-pdo-dblib` / `php7.x-sybase`;Windows: `php_pdo_dblib.dll`)
- FreeTDS 庫支援 (Linux 通常隨套件安裝)
- SQL Server 啟用 TCP/IP 協定,預設埠 1433
連線程式碼
<?php
try {
$hostname = '117.79.93.222';
$port = 1433;
$dbname = 'csdn';
$username = 'csdn_admin';
$password = '123456';
// DSN 格式:dblib:host=IP:port;dbname=DB
$dsn = "dblib:host={$hostname}:{$port};dbname={$dbname}";
$dbh = new PDO($dsn, $username, $password);
// 設定錯誤模式為例外
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "連線 MSSQL 成功\n";
// 準備陳述式查詢
$stmt = $dbh->prepare("SELECT * FROM CSDNUser");
$stmt->execute();
// 逐行取得結果
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
print_r($row);
}
} catch (PDOException $e) {
die("連線失敗: " . $e->getMessage());
} finally {
$stmt = null;
$dbh = null;
}
?>
DSN 參數完整說明
| 參數 | 說明 | 範例 |
| host | 伺服器 IP 或主機名 | 192.168.1.100 |
| port | TCP 埠號 | 1433 (預設) |
| dbname | 資料庫名稱 | mydb |
| charset | 字元集 (FreeTDS 0.95+) | UTF-8 |
| appname | 應用程式名稱 (顯示於 SQL Server 監控) | MyPHPApp |
| version | TDS 協定版本 | 7.0 (SQL 2000), 7.1, 7.2, 7.3, 7.4 |
完整 DSN 範例:`dblib:host=192.168.1.100:1433;dbname=mydb;charset=UTF-8;version=7.4`
常見問題排查
| 錯誤訊息 | 原因 | 解決方案 |
| could not find driver | 未安裝 pdo_dblib | `yum install php-pdo-dblib` / `apt install php-sybase` / 啟用 DLL |
| Adaptive Server connection failed | 網路不通/埠錯誤/防火牆 | telnet IP 1433 測試、檢查 SQL Server 組態管理員 TCP/IP 啟用 |
| Login failed | 帳號密碼錯誤/權限不足 | 確認 SQL Server 驗證模式 (混合模式)、登入帳號對應資料庫用戶 |
| Unicode data in a Unicode-only collation | 字元集不匹配 | DSN 加 `charset=UTF-8`、確認資料庫/欄位定序、PHP 字串為 UTF-8 |
| Invalid cursor state | 多結果集/游標問題 | `$stmt->nextRowset()` 處理多結果集、避免未關閉游標重複查詢 |
進階用法:參數綁定與交易
<?php
// 參數綁定 (防 SQL 注入)
$stmt = $dbh->prepare("SELECT * FROM Users WHERE Email = ? AND Status = ?");
$stmt->execute([$email, 1]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
// 交易控制
try {
$dbh->beginTransaction();
$dbh->exec("INSERT INTO Log (msg) VALUES ('Step 1')");
$dbh->exec("UPDATE Account SET balance = balance - 100 WHERE id = 1");
$dbh->exec("INSERT INTO Log (msg) VALUES ('Step 2')");
$dbh->commit();
} catch (Exception $e) {
$dbh->rollBack();
throw $e;
}
?>
Windows 開發環境快速設定
- 下載對應 PHP 版本的 `php_pdo_dblib.dll`、`php_pdo_sqlsrv.dll` (Microsoft 官方驅動)
- 放入 `ext/` 目錄
- `php.ini` 啟用:`extension=pdo_dblib`、`extension=pdo_sqlsrv`
- 重啟 Apache/Nginx/PHP-FPM
- 測試:`php -r "print_r(PDO::getAvailableDrivers());"` 應包含 `dblib`, `sqlsrv`