PHP查询SQLserver
PHP连SQL Server,这事儿说难不难,说简单也藏着不少坑。我去年接手一个老项目,后台是PHP,数据库却是微软家的SQL Server 2008 R2,光是连库就折腾了两个通宵。
最直接的方案是微软官方出的PDO_SQLSRV驱动。注意,PHP 7.4以上版本得用PDO_SQLSRV 5.9+,PHP 8.0就得上5.10。装这玩意儿之前,你得先装Microsoft ODBC Driver 17 for SQL Server,这步漏了,后面全是白搭。我那次就是先装了PDO扩展,结果phpinfo里死活看不到,后来才发现是ODBC驱动版本不对——64位系统装成32位驱动,报错信息还含糊得很,只说“无法加载”。
连接代码其实就几行:
$serverName = "192.168.1.100,1433"; $connectionOptions = array( "Database" => "mydb", "Uid" => "sa", "PWD" => "password" ); $conn = sqlsrv_connect($serverName, $connectionOptions); if($conn === false) { die(print_r(sqlsrv_errors(), true)); } 注意那个逗号加端口号,SQL Server默认1433端口,但如果你实例是命名实例,比如“SERVER\SQLEXPRESS”,那写法又不一样了——得用“SERVER\SQLEXPRESS”这种格式,端口号反而不写了。这个细节坑过不少人,包括我。
真正让人头疼的是字符集问题。SQL Server默认用Latin1_General排序规则,而PHP这边UTF-8是标配。你查出来的中文全是乱码?别急着改代码,先看看连接参数里有没有加“CharacterSet”=>“UTF-8”。我那个项目里,老同事写的代码没加这个参数,页面全是问号,加了之后立竿见影。但别高兴太早,如果数据库字段本身用的是nvarchar,那没问题;要是varchar存中文,神仙也救不了你——存储时就已经乱码了。
性能方面有个小技巧。sqlsrv_query和sqlsrv_prepare+sqlsrv_execute,前者适合一次性查询,后者适合循环执行。我处理批量导入时,用prepare方式把一万条insert语句打包执行,耗时从原来的三分钟降到二十秒。这算是个意外收获,因为文档里没细说,纯粹是试出来的。
还有个容易忽略的点:sqlsrv_connect默认不会启用连接池。如果你在高并发场景下频繁开关连接,数据库服务器会疯掉。解决办法是给连接参数加“ConnectionPooling”=>“1”。这个参数藏得深,网上教程十有八九不提,但生产环境必须开。
最后说个真实案例。上个月帮朋友排查一个问题,他的PHP站点连的是云服务器上的SQL Server,偶尔报“SSL Security Error”。查了半天,原来是云服务商的安全组默认禁用了1433端口的SSL握手。解决方案很简单——在连接参数里加“Encrypt”=>“false”,强制关闭加密。虽然安全性降了,但内网环境其实无所谓。
说到底,PHP连SQL Server不是技术难题,是细节问题。版本匹配、驱动安装、端口配置、字符集、连接池,每一个环节都可能翻车。但只要把这些坑趟平了,跑起来比MySQL还稳。我的建议是先在本地搭个最小环境测试,确认能连上再写业务代码,别像我当初那样,一上来就怼完整项目,排查问题的时候连是环境问题还是代码问题都分不清。