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

PHP 連接 SQL Server 2008/2005 (SQLSRV) 完整配置指南:驅動安裝、PDO 連接、類封裝

     編輯:PHP 相關知識

PHP 連接 SQL Server 2008/2005 (SQLSRV) 完整配置指南:驅動安裝、PDO 連接、類封裝

PHP 連接 SQL Server 2000 用 php_mssql.dll,但 2005/2008+ 必須使用微軟官方 SQLSRV 驅動。本文詳述驅動下載、版本選擇、php.ini 配置、PDO 連接代碼、資料庫操作類封裝全流程。

一、驅動下載與版本選擇

官方下載:Microsoft Drivers for PHP for SQL Server

解壓後獲得多個 .dll,命名規則:

php_sqlsrv_{版本}_{ts|nts}_{vc6|vc9|vc11|vc14|vc15}.dll
php_pdo_sqlsrv_{版本}_{ts|nts}_{vc6|vc9|vc11|vc14|vc15}.dll

常見組合範例

  • PHP 5.6 TS VC11 (Windows 常見) → php_sqlsrv_56_ts_vc11.dll + php_pdo_sqlsrv_56_ts_vc11.dll
  • PHP 7.4 NTS VC15 → php_sqlsrv_74_nts_vc15.dll + php_pdo_sqlsrv_74_nts_vc15.dll
  • PHP 8.1+ → 使用 sqlsrv 5.10+ / pdo_sqlsrv 5.10+ (PECL 安裝)

二、安裝配置步驟

  1. 將對應 .dll 複製到 PHP ext 目錄(如 C:\php\ext\)
  2. 編輯 php.ini,在 Dynamic Extensions 區添加:
    extension=php_sqlsrv_56_ts_vc11.dll
    extension=php_pdo_sqlsrv_56_ts_vc11.dll
    ; 必須啟用 PDO 核心
    extension=php_pdo.dll
  3. 重啟 Web 服務(Apache/Nginx+PHP-FPM/IIS)
  4. 驗證:php -m | grep sqlsrv 或 phpinfo() 搜尋 sqlsrv

三、PDO 連接代碼範例

 'MyDatabase',
    'UID'      => 'sa',
    'PWD'      => 'StrongPassword123',
    'CharacterSet' => 'UTF-8', // 重要:指定字符集避免亂碼
];

try {
    $pdo = new PDO("sqlsrv:Server=$serverName;Database={$connInfo['Database']}", 
                   $connInfo['UID'], $connInfo['PWD']);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    // 測試查詢
    $stmt = $pdo->query("SELECT TOP 10 * FROM UserTable");
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        echo $row['UserName'] . "
"; } } catch (PDOException $e) { die("連接失敗: " . $e->getMessage()); } ?>

四、資料庫操作類封裝 (MSSQL_DB)

class MSSQL_DB {
    private $pdo;
    
    public function __construct($host, $user, $pass, $dbname, $charset = 'UTF-8') {
        $dsn = "sqlsrv:Server=$host;Database=$dbname;CharacterSet=$charset";
        $this->pdo = new PDO($dsn, $user, $pass);
        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    
    public function query($sql, $params = []) {
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($params);
        return $stmt;
    }
    
    public function getRow($sql, $params = []) {
        return $this->query($sql, $params)->fetch(PDO::FETCH_ASSOC);
    }
    
    public function getAll($sql, $params = []) {
        return $this->query($sql, $params)->fetchAll(PDO::FETCH_ASSOC);
    }
    
    public function insert($table, array $data) {
        $fields = implode(',', array_keys($data));
        $placeholders = ':' . implode(',:', array_keys($data));
        $sql = "INSERT INTO $table ($fields) VALUES ($placeholders)";
        $this->query($sql, $data);
        return $this->pdo->lastInsertId();
    }
    
    public function update($table, array $data, $where, $whereParams = []) {
        $sets = [];
        foreach (array_keys($data) as $col) $sets[] = "$col = :$col";
        $sql = "UPDATE $table SET " . implode(',', $sets) . " WHERE $where";
        $params = array_merge($data, $whereParams);
        return $this->query($sql, $params)->rowCount();
    }
    
    public function __destruct() {
        $this->pdo = null;
    }
}

// 使用範例
$db = new MSSQL_DB('192.168.1.100\SQLEXPRESS', 'sa', 'pwd', 'MyDB');
$users = $db->getAll("SELECT * FROM crm_order_batch WHERE (status=0 OR status IS NULL) AND lock_id IS NOT NULL");

五、常見問題排查

「Could not find driver」
驅動未安裝/版本不匹配/未重啟 PHP。檢查 php -m、phpinfo()、DLL 文件是否在 ext 目錄。
「SQLSTATE[08001]: [Microsoft][ODBC Driver 17] TCP Provider: Error code 0x274D」
服務器名/實例名錯誤、防火牆阻攔 1433 端口、SQL Server 未啟用 TCP/IP 協議。用 SQL Server Configuration Manager 啟用 TCP/IP。
中文亂碼
連接字串加 CharacterSet=UTF-8;資料庫欄位用 NVARCHAR;PHP 文件保存為 UTF-8 無 BOM。
PHP 7/8 找不到對應 DLL
官方不再提供獨立 DLL,改用 PECL 安裝:pecl install sqlsrv pdo_sqlsrv,或從 GitHub Releases 下載預編譯版。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
字段含義選擇依據
版本52=PHP 5.2, 53=5.3, 54=5.4, 55=5.5, 56=5.6, 7=7.0+php -v 確認
ts/ntsThread Safe / Non-Thread Safephp -i | grep "Thread Safety"
vc版本Visual C++ 編譯器版本php -i | grep "Compiler",VC11=VS2012, VC14=VS2015, VC15=VS2017