先确认环境与驱动
PHP本身没有内置MSSQL驱动。连接SQL Server需要额外扩展,常见三类:微软官方sqlsrv(过程式接口)、PDOSQLSRV(PDO接口)和FreeTDS体系下的PDODBLIB。新版PHP建议优先使用微软驱动,它对SQL Server 2012及以上版本支持更完整,也支持Windows身份验证。
三种方案对比
sqlsrv扩展
函数风格,类似mysqli,适合偏好过程式代码的项目。连接写法:
$conn = sqlsrv_connect(‘127.0.0.1’, [
‘Database’ => ‘demo’,
‘UID’ => ‘sa’,
‘PWD’ => ‘secret’,
‘CharacterSet’ => ‘UTF-8’,
]);
if ($conn === false) {
die(printr(sqlsrverrors(), true));
}
PDO_SQLSRV
推荐新项目使用。统一PDO接口,支持预处理与异常模式:
$pdo = new PDO(
‘sqlsrv:Server=127.0.0.1;Database=demo’,
‘sa’, ‘secret’,
[PDO::ATTRERRMODE => PDO::ERRMODEEXCEPTION]
);
PDO_DBLIB
Linux下通过FreeTDS连接,无需微软驱动,但字符集和日期类型处理需额外留意,适合无法安装微软扩展的老环境。
安装与配置要点
Windows下将对应PHP版本的phpsqlsrv与phppdosqlsrv DLL放入ext目录,并在php.ini中启用;同时安装ODBC Driver for SQL Server。Linux下用pecl安装sqlsrv与pdosqlsrv,先装msodbcsql与unixODBC开发包。启用后可用php -m确认扩展已加载。
字符集与错误处理
连接字符串中显式指定CharacterSet=UTF-8,避免中文乱码。开启PDO异常模式后,用try/catch捕获PDOException,比静默返回false更易排查。注意SQL Server的datetime精度与PHP DateTime的转换差异。
参数化查询示例
$stmt = $pdo->prepare(‘SELECT id, name FROM users WHERE dept = ? AND age > ?’);
$stmt->execute([‘技术部’, 25]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
常见坑
一是PHP大版本与驱动版本不匹配,导致扩展加载失败;二是Linux下未装ODBC驱动,仅装pecl扩展仍无法连接;三是连接超时,需在连接串中设置LoginTimeout。逐一排查扩展、驱动、网络三层,多数连接问题可定位。