| 字段 | 含義 | 選擇依據 |
| 版本 | 52=PHP 5.2, 53=5.3, 54=5.4, 55=5.5, 56=5.6, 7=7.0+ | php -v 確認 |
| ts/nts | Thread Safe / Non-Thread Safe | php -i | grep "Thread Safety" |
| vc版本 | Visual C++ 編譯器版本 | php -i | grep "Compiler",VC11=VS2012, VC14=VS2015, VC15=VS2017 |
常見組合範例
- 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 安裝)
二、安裝配置步驟
- 將對應
.dll 複製到 PHP ext 目錄(如 C:\php\ext\)
- 編輯
php.ini,在 Dynamic Extensions 區添加:
extension=php_sqlsrv_56_ts_vc11.dll
extension=php_pdo_sqlsrv_56_ts_vc11.dll
; 必須啟用 PDO 核心
extension=php_pdo.dll
- 重啟 Web 服務(Apache/Nginx+PHP-FPM/IIS)
- 驗證:
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 下載預編譯版。
- 上一篇文章: 百度實時推送 API 接口 PHP 實現:主動推送新增內容加速收錄
- 下一篇文章: PHP 獲取當前頁面完整 URL 的實用函數與技巧總結
Copyright ©
程式碼之家 All Rights Reserved