Linux下PHP5.3+连接sql server那些坑

November 1, 2016 2:58 AM

前言

PHP5.3在Linux下不支持mssql,pdo_mssql_sqlsrv扩展,我们在连接sql server的时候我选择了pdo_odbc扩展去连接,遇到了以下问题和需要注意的。

软件版本

PHP :5.3 Freetds : freetds-0.91.112 unixODBC: unixODBC-2.3.2

安装freetds,unixODBC,PDO_ODBC

参阅:http://www.moell.cn/article/6

问题

1. 字符集编码问题 如果你的程序是GBK,sql server是Chinese_PRC_CI_AS,PDO_ODBC返回的字符集和unixODBC有关,默认返回UTF-8,所以注意转换。

2. PDO预处理问题 PDO无法使用预处理绑定参数。

错误实例

	/**
     * @param $status
     * @return mixed
     */
    private function getSynStatus($type)
    {
		$sql = "select top 1 * from I_SYN WHERE FNote = :type";
        $statment = $this->pdo->prepare($sql);
        $statment->execute(array(":type" => $type)); //注意这里
        $status = $statment->fetch(PDO::FETCH_ASSOC);
        return $status['FStatus'];
    }

报错信息 PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 402 [FreeTDS][SQL Server]The data types nvarchar and text are incompatible in the equal to operator. (SQLExecute[402]

解决办法:不使用预处理

    /**
     * @param $status
     * @return mixed
     */
    private function getSynStatus($type)
    {
        $sql = "select top 1 * from I_SYN WHERE FCate = '".$type."'";
        $statment = $this->pdo->query($sql);
        $status = $statment->fetch(PDO::FETCH_ASSOC);
        return $status['FStatus'];
    }

个人建议

PHP在linux下不到万不得已,不要使用php 与 sql server交互。