首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP PDO 連接 SQL Server (MSSQL) 完整教學:dblib 驅動設定與查詢實例

     編輯:PHP 綜合知識

環境需求

  • 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
portTCP 埠號1433 (預設)
dbname資料庫名稱mydb
charset字元集 (FreeTDS 0.95+)UTF-8
appname應用程式名稱 (顯示於 SQL Server 監控)MyPHPApp
versionTDS 協定版本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 開發環境快速設定

  1. 下載對應 PHP 版本的 `php_pdo_dblib.dll`、`php_pdo_sqlsrv.dll` (Microsoft 官方驅動)
  2. 放入 `ext/` 目錄
  3. `php.ini` 啟用:`extension=pdo_dblib`、`extension=pdo_sqlsrv`
  4. 重啟 Apache/Nginx/PHP-FPM
  5. 測試:`php -r "print_r(PDO::getAvailableDrivers());"` 應包含 `dblib`, `sqlsrv`
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved