
PHP连接MS SqlServer
- 小魔童
- 0
- Posted on
PHP连接MySQL、SQLite等数据库是很简单的,它生来就支持,并且各种工具箱软件(如XAMP、PHPStudy等)都会内置这些数据库的扩展支持,启用(甚至默认就启用)即可。但是,PHP连接MS SQLServer则需要另外安装扩展,并且还需要安装ODBC支持,安装过程并不复杂,但却不少需要注意的地方(主要是版本匹配),有一处不对都可能不成功。
首先,必须对你所使用的PHP了解清楚,包括它的版本(我的是7.3.21),32位还是64位(我的是Win10下的64位),线程安全(ts)还是非线程安全(nts)。方法是使用打开phpinfo()函数列出,XAMP的默认主页有phpinfo()链接,直接打开即可;PHPStudy则没有,需要自己制作一个页面并浏览,页面内容类似这样:
<?php phpinfo(); ?>
页面头部字体最大的就是PHP版本,下面的表中列出了各种配置,“Architecture”一项为“x64”表示是64位,这指的是操作系统,XAMP或PHPStudy一般是与系统匹配的,另一项“Thread Safety”,如果值为“enabled” 则表示是线程安全。
接下来是具体的配置步骤
- 首先下载并安装php_sqlsrv扩展
从其中找到适合的版本,一般按照发布年份与你的PHP相近即可,比如我的PHP 7.3.21则找2019年前发行的5.8,2020年之后发行的则无法使用。无法确定时,可以从新到旧尝试。
- 点击“Download Windows Package”下载安装包(实际是自解压包),直接使用WinRAR解压到指定路径即可。
解压出来的文件类似“php_sqlsrv_73_ts_x64.dll”多个文件,选适合的放到PHP的ext目录即可。比如我的PHP 7.3.21 64位 线程安装,使用的是php_sqlsrv_73_ts_x64,还有对应的pdo文件“php_pdo_sqlsrv_73_ts_x64.dll”,其中73代表PHP版本,ts和nts代表线程安全和非线程安全,x64表示64位。
- 复制好文件之后,打开PHP目录中的php.ini配置文件,在扩展配置行(大约950行)后添加两句:
extension=php_sqlsrv_73_ts_x64.dll extension=php_pdo_sqlsrv_73_ts_x64.dll
重启XAMP服务即可,重启后可以在XAMP或PHPStudy中查看是否有启动扩展。
- 也可以在phpinfo()函数页面中查看配置(可搜索sqlsrv),如果php_sqlsrv与php_pdo_sqlsrv两个扩展正常启用,会在页面有类似的配置:
- 安装MSODBC
下载的版本同样参考其发布日期,与你所使用的PHP版本发布日期相近即可(与我的PHP 7.3.21匹配的是17.4),或者从新到旧尝试。安装了新版本不行,再下载旧版本安装,其会提示“升级”,继续安装即可,它会自动覆盖。
- 安装好扩展和MSODBC之后,就可以测试验证SQLServer的访问了。
安照文档编写PHP页面,访问你的SQLServer数据库,以下是我根据自己数据库修改过的页面源码:
<html>
<head>
<meta charset="UTF-8" /> <!--实际上这一句没起作用-->
</head>
<body>
<?php
//这一句才起到设置页面编码的作用。
header('Content-Type:text/html; charset=GB2312');
/**
*参考:https://docs.microsoft.com/zh-cn/previous-versions/msdn10/dd744859(v=msdn.10)
*/
$serverName = "(local)";
$connectionOptions = array("Database"=>"MESDB2", "UID"=>"sa", "PWD"=>"sa登录密码");
/* Connect using Windows Authentication. */
$conn = sqlsrv_connect( $serverName, $connectionOptions);
if( $conn === false )
{
var_dump(sqlsrv_errors());
die();
}
else {
echo 'OK!';
$tsql = "SELECT * FROM ems_users";
$users = sqlsrv_query( $conn, $tsql);
if ( $users === false)
{
var_dump(sqlsrv_errors());
die();
}
else {
print_r($users);
$i = 0;
while( $row = sqlsrv_fetch_array( $users, SQLSRV_FETCH_ASSOC))
{
print_r( $row );
$i++;
}
echo "i = $i";
}
}
?>
</body>
</html>
其中,文档使用的是Windows集成登录,可以不提供用户名和密码参数,我这里改为sa登录,需要指定密码。
- 这个页面浏览得到的是乱码(一堆黑底白字的问号),因为页面默认UTF-8编码,而我的SQLServer数据库是GB2312编码的,需要用
header('Content-Type:text/html; charset=GB2312');
来指定编码,经过尝试,用html charset方式指定是不起作用的,不知是何原因。