PHP连接MS SqlServer

        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” 则表示是线程安全。


接下来是具体的配置步骤

  1. 首先下载并安装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两个扩展正常启用,会在页面有类似的配置:
  1. 安装MSODBC

下载的版本同样参考其发布日期,与你所使用的PHP版本发布日期相近即可(与我的PHP 7.3.21匹配的是17.4),或者从新到旧尝试。安装了新版本不行,再下载旧版本安装,其会提示“升级”,继续安装即可,它会自动覆盖。

  1. 安装好扩展和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方式指定是不起作用的,不知是何原因。
Previous Post Next Post

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注