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

PHP 5.3+ 連接 SQL Server 完整解決方案:sqlsrv、PDO_SQLSRV 與 ODBC 三種驅動實測

     編輯:PHP 綜合知識

PHP 5.3 起移除舊版 mssql 擴充,官方推薦使用 Microsoft 維護的 sqlsrv / PDO_SQLSRV 驅動,或通用 ODBC 方式。本文詳述三種方案的安裝、設定、連線程式碼與適用場景,並附上常見坑點排查。

方案一:sqlsrv + PDO_SQLSRV (官方推薦、功能最完整)

1. 下載對應版本

  • 前往 Microsoft Drivers for PHP for SQL Server 下載最新 .exe (如 SQLSRV5.8.0.exe)。
  • 解壓縮,依 PHP 版本、Thread Safe (TS) / Non-Thread Safe (NTS)、VC 編譯版本 (VC11/VC14/VC15) 選擇正確 .dll:
    php_sqlsrv_74_nts_x64.dll、php_pdo_sqlsrv_74_nts_x64.dll 等。

2. 安裝步驟 (Windows + Apache/Nginx)

  1. 將兩支 .dll 複製到 PHP ext 目錄。
  2. 編輯 php.ini,新增:
extension=php_sqlsrv_74_nts_x64.dll
extension=php_pdo_sqlsrv_74_nts_x64.dll
  1. 重啟 Web Server (Apache/Nginx/PHP-FPM)。
  2. 執行 php -m | findstr sqlsrv 確認載入成功。

3. 必裝元件:ODBC Driver + SQL Server Native Client

驅動需配合 Microsoft ODBC Driver for SQL Server (建議 17/18 版) 與 SQL Server Native Client (舊版相容) 才能連線。下載 msodbcsql.msi 與 sqlncli.msi 安裝。

4. 連線程式碼 (sqlsrv 程序式)

<?php
$serverName = '127.0.0.1'; // 或 'localhost,1433'、'(local)\SQLEXPRESS'
$connInfo = [
    'UID'       => 'sa',
    'PWD'       => 'your_password',
    'Database'  => 'master',
    'CharacterSet' => 'UTF-8', // 重要:指定編碼
];

$conn = sqlsrv_connect($serverName, $connInfo);
if ($conn === false) {
    die(print_r(sqlsrv_errors(), true));
}
echo '連線成功';

// 查詢範例
$sql = 'SELECT * FROM sys.tables';
$stmt = sqlsrv_query($conn, $sql);
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
    print_r($row);
}
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>

5. 連線程式碼 (PDO_SQLSRV 物件導向)

<?php
$dsn = 'sqlsrv:Server=127.0.0.1;Database=master;ConnectionPooling=1';
$opt = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];

try {
    $pdo = new PDO($dsn, 'sa', 'your_password', $opt);
    $stmt = $pdo->query('SELECT @@VERSION');
    echo $stmt->fetchColumn();
} catch (PDOException $e) {
    echo '失敗:' . $e->getMessage();
}
?>

方案二:ODBC (通用、跨平台、效能稍遜)

適用於 Linux + FreeTDS、或不想安裝專用驅動的環境。

<?php
$dsn = 'odbc:Driver={ODBC Driver 17 for SQL Server};Server=127.0.0.1;Database=master;';
$pdo = new PDO($dsn, 'sa', 'your_password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->query('SELECT * FROM sys.tables');
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    print_r($row);
}
?>

Linux 安裝 FreeTDS + unixODBC:

yum install freetds unixODBC php-odbc
# /etc/odbcinst.ini
[FreeTDS]
Driver = /usr/lib64/libtdsodbc.so
Setup = /usr/lib64/libtdsS.so
FileUsage = 1

方案三:COM (僅 Windows、舊版相容、不推薦新專案)

<?php
$conn = new COM('ADODB.Connection');
$conn->Open("Provider=SQLOLEDB;Data Source=127.0.0.1;Initial Catalog=master;User ID=sa;Password=pass;");
$rs = $conn->Execute('SELECT * FROM sys.tables');
while (!$rs->EOF) {
    print_r($rs->Fields['name']->Value);
    $rs->MoveNext();
}
$conn->Close();
?>

常見坑點與排查

現象原因解決
找不到驅動 / 類別不存在dll 版本不符 (TS/NTS、VC版、PHP版)用 php -i 確認 Compiler、Thread Safety,下載完全一致的 dll
連線失敗:Login timeout expired防火牆阻擋 1433、SQL Server 未啟用 TCP/IPSQL Server Configuration Manager 啟用 TCP/IP、防火牆開放 1433
中文亂碼 / ? 亂碼未指定 CharacterSet 或 DB 定序不支援 Unicode連線字串加 CharacterSet=UTF-8、欄位用 NVARCHAR
PDO::exec 回傳 false 但無例外未設定 ERRMODE_EXCEPTION建立 PDO 時加入 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

版本相容性速查表 (2024 年最新)

PHP 版本sqlsrv / pdo_sqlsrv 版本ODBC Driver 版本支援 SQL Server 版本
7.45.8 / 5.917 / 182012 ~ 2022
8.0 / 8.1 / 8.2 / 8.35.10 / 5.11 / 5.12 (最新)18 (建議)2012 ~ 2022

小結

新專案首選 PDO_SQLSRV:標準 PDO 介面、支援預處理、參數綁定、交易、錯誤例外,程式碼可攜性最高。舊專案維護可用 sqlsrv 程序式 API。跨平台部署請用 ODBC + FreeTDS。務必安裝對應版本的 ODBC Driver 17/18 並指定 CharacterSet=UTF-8 解決中文編碼問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved