PHP 连接 MSSQL 2008 数据库(SQLSRV)

用PHP连接MSSQL2008数据库,开始使用了ODBC连接,连接和读取都没有问题,但是遇到SQL2008中的Nvarchar字段就不好处理了,因为读到的文本右边总是有很多空格,读取到的中文是GBK的,用iconv转成utf-8后右边的空格用Rtrim总是去不干净,有些去掉了,有些没有去掉,尾部出现奇怪的字符,无论转码前去还是转码后去都不能去除干净,虽然在SQL语句中可以使用RTRIM来去除,但有些存储过程中不能用RTRIM。于是就想用另的连接方法,但原来的mssql扩展在PHP5.3+中已经不能用了,能用也连接不到SQL2008。查了相关资料,原来MS有针对PHP5.2+和SQL高版本的扩展库的。

下载地址:http://www.microsoft.com/en-us/download/details.aspx?id=20098

下载到的是SQLSRV30.EXE或SQLSRV20.EXE的可执行文件,30的在windows2003中运行不了,在win7中可以的,运行文件会提示让你输入(浏览)你PHP的ext目录路径,选择后确定就会有一些文件释放到你的ext目录,其实解压在那都可以。

有很多文件释放了,dll文件其实只用两个,这个跟据你的PHP版本来选的,里面还有个chm帮助文件,是SQLSRV的安装配置方法和API,至于先VC9还是VC6,还有ts还是nts,那就去看你的phpinfo()吧!! 接下来就是编辑php.ini文件了,打开以后添加以下设置:

[PHP_SQLSRV]
extension = php_sqlsrv_53_nts_vc9.dll

如果你使用PDO_SQLSRV还需要添加:

[PHP_PDO_SQLSRV]
extension=php_pdo_sqlsrv_53_nts_vc9.dll

关于VC6和VC9的区别,还有非线程安全与线程安全
VC6 版本是使用 Visual Studio 6 编译器编译的,如果你是在windows下使用Apache+PHP的,请选择VC6版本。
VC9 版本是使用 Visual Studio 2008 编译器编译的,如果你是在windows下使用IIS+PHP的,请选择VC9版本。
Non Thread Safe就是非线程安全,在执行时不进行线程(Thread)安全检查;
Thread Safe 是线程安全,执行时会进行线程(Thread)安全检查,以防止有新要求就启动新线程的 CGI 执行方式而耗尽系统资源;

链接示例:

mssql_lib.php

<?php


class DB {
    var $con = null;
    function __construct($dbhost,$dbuser,$dbpass,$dbname) {
        $connectionInfo =  array("UID"=>$dbuser,"PWD"=>$dbpass,"Database"=>$dbname);
        $this->con = sqlsrv_connect($dbhost,$connectionInfo);
    }

    function query($sql){
        $result = sqlsrv_query($this->con, $sql);
    }

    function getRow($sql){
        $result = sqlsrv_query($this->con, $sql);
        $arr = array();
        while($row = sqlsrv_fetch_array($result))
        {
            $arr[] = $row;
        }
        return $arr[0];
    }

    function getAll($sql){
        $result = sqlsrv_query($this->con, $sql);
        $arr = array();
        while($row = sqlsrv_fetch_array($result))
        {
            $arr[] = $row;
        }
        return $arr;
    }

    function __destruct() {
        unset($con);
    }

}

test.php

//简单调用
$db = new DB(DB_HOST, DB_USER, DB_PASS, DB_NAME);
$sql = "select * from crm_order_batch where (status=0 or status is null) and lock_id is not null  ";
$orders_add_list = $db->getAll($sql);