自 PHP 5.3 起,官方移除了舊版 mssql 擴展(mssql_connect 等函數),導致大量遷移專案無法直接連接 SQL Server。微軟官方提供了 SQLSRV 驅動作為替代方案,支援 PHP 5.3~7.x 及 Windows/Linux 環境。
SQLSRV*.exe。php_pdo_sqlsrv_*_nts.dll 與 php_sqlsrv_*_nts.dll 複製到 php/ext 目錄。[PHP_PDO_SQLSRV]
extension=php_pdo_sqlsrv_53_nts_vc9.dll
[PHP_SQLSRV]
extension=php_sqlsrv_53_nts_vc9.dll
注意:文件名需與實際下載的 DLL 完全一致,區分 TS/Non-TS 及 VC 版本。
httpd -k restart,Nginx + PHP-FPM 執行 service php-fpm restart。php -m | findstr sqlsrv 或 phpinfo() 搜尋「sqlsrv」與「pdo_sqlsrv」。<?php
$serverName = "127.0.0.1"; // 或 "(local)"
$connectionInfo = array(
"UID" => "sa",
"PWD" => "your_password",
"Database" => "master",
"CharacterSet" => "UTF-8" // 解決中文亂碼
);
$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn === false) {
die(print_r(sqlsrv_errors(), true));
}
echo "連接成功!";
// 查詢示例
$sql = "SELECT TOP 10 * FROM sys.tables";
$stmt = sqlsrv_query($conn, $sql);
if ($stmt === false) die(print_r(sqlsrv_errors(), true));
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
print_r($row);
}
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
<?php
$dsn = "sqlsrv:Server=127.0.0.1;Database=master";
$user = "sa";
$pass = "your_password";
try {
$pdo = new PDO($dsn, $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->query("SELECT @@VERSION");
echo $stmt->fetchColumn();
} catch (PDOException $e) {
echo "連接失敗:" . $e->getMessage();
}
?>
<?php
$conn = odbc_connect(
"Driver={ODBC Driver 17 for SQL Server};Server=127.0.0.1;Database=master;",
"sa", "your_password"
);
if (!$conn) exit("ODBC 連接失敗");
$sql = "SELECT * FROM sys.databases";
$rs = odbc_exec($conn, $sql);
while ($row = odbc_fetch_array($rs)) {
print_r($row);
}
odbc_close($conn);
?>
| 錯誤現象 | 原因 | 解決方法 |
|---|---|---|
| Call to undefined function sqlsrv_connect() | 擴展未載入或 DLL 版本不匹配 | 核對 php.ini、PHP 版本、TS/Non-TS、VC 版本;重啟服務 |
| Connection failed: [Microsoft][ODBC Driver] SSL Provider: certificate chain | SQL Server 強制加密且憑證不受信 | 連接字串加 TrustServerCertificate=Yes 或配置有效憑證 |
| 中文亂碼 | 字符集未指定 | 連接參數加 CharacterSet=UTF-8;資料庫欄位用 nvarchar |
| Linux 環境連接失敗 | 缺少 Microsoft ODBC Driver for Linux | 按官方文檔安裝 unixODBC + MS ODBC Driver 17/18 |
yum install unixODBC unixODBC-devel 或 apt-get install unixodbc unixodbc-dev。pecl install sqlsrv pdo_sqlsrv(需 php-devel、gcc、make)。PHP 5.3+ 連接 SQL Server 的標準路徑是「安裝 SQLSRV 擴展 + Microsoft ODBC Driver」。原生 sqlsrv 函數性能最佳,PDO 適合多資料庫抽象層,ODBC 適合不想安裝 SQLSRV 的場景。生產環境務必啟用加密連接、使用參數化查詢防注入,並配置連接池提升併發能力。