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

2016-11-01 02:58:05   php

  php  

前言

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无法使用预处理绑定参数。

错误实例

  1. /**
  2. * @param $status
  3. * @return mixed
  4. */
  5. private function getSynStatus($type)
  6. {
  7. $sql = "select top 1 * from I_SYN WHERE FNote = :type";
  8. $statment = $this->pdo->prepare($sql);
  9. $statment->execute(array(":type" => $type)); //注意这里
  10. $status = $statment->fetch(PDO::FETCH_ASSOC);
  11. return $status['FStatus'];
  12. }

报错信息
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]

解决办法:不使用预处理

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

个人建议

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