thinkphp连接sql server 2008(同时支持windows和linux环境)

来源:互联网 发布:linux 内核空间地址 编辑:程序博客网 时间:2024/06/04 18:00

最近遇到一个项目,需要用thinkphp访问sqlserver 2008数据库,而且数据库的表名和字段名都是中文,费了九牛二虎之力终于可以读取了,写入还没来得及测试,如果遇到问题后续补充吧。

        总体思路分为两个步骤 1、寻找php连接sqlserver数据库驱动,2、解决中文表名和字段名问题

       1、php连接sqlserver数据库驱动

        我先按照网上的方法找了php_sqlsrv_54_ts.dll和php_pdo_sqlsrv_54_ts.dll ,此驱动可以连接成功,但是只支持windows平台。项目要求同时支持linux平台,没办法,后来终于找到了php_dblib.dll。下载地址:http://download.csdn.net/detail/hanzengyi/9588630

       先将php_dblib.dll拷贝到php安装目录的ext文件夹下,修改php.ini,添加 extension = php_dblib.dll。然后修改thinkphp的配置文件:


'DB_SQLSERVER' = array('db_type'  => 'mssql','db_user'  => 'hzy','db_pwd'   => 'hzy','db_host'  => 'localhost',//'db_port'  => '1433','db_name'  => 'jwwxtemp','db_charset' => 'GB2312',);


写个简单的测试方法,表名:测试表,字段名:测试

public function index(){$table_name = iconv('UTF-8', 'GB2312', '测试表');//utf8中文表名转gb2312$col_name = iconv('UTF-8', 'GB2312', '测试');//utf8中文字段名转gb2312$result = M($table_name,null,C('DB_SQLSERVER'))->where(array($col_name=>'1'))->select();//从表“测试表”中查询字段"测试"=1的记录dump($result[$col_name]);//打印“测试”字段的值}

数据库信息填写正确,且账户权限正确的话,$result就是要查找的记录。但是得出的字段名为中文,不能被索引到,所以dump($result[$col_name]);会打印NULL。要想索引正确,必须将$result的key和value都转成utf8格式。

2、解决中文表名和字段名问题

以下两个方法将M()->select()得到的单行记录和多行记录转换成utf8格式

//将一行记录转换成utf8格式,适用于M()->select()返回单行记录时public function row2utf8($Result) {$Row = array();$key1=array_keys($Result);$key2 = array_keys($Result[$key1[0]]);for($i=0;$i<count($key2);$i++) {$Row[ iconv( 'gb2312', 'utf-8',$key2[ $i ]) ] = iconv( 'gb2312', 'utf-8', $Result[ 0 ][ $key2[ $i ] ] );}return $Row;}//将记录列表转换成utf8格式,适用于M()->select()返回多行记录列表时public function list2utf8($Result) {$Row = array();$key1=array_keys($Result);$key2 = array_keys($Result[$key1[0]]);for($i=0;$i<count($key1);$i++) {for( $j=0; $j<count( $key2 ); $j++ ) {$Row[ $key1[ $i ] ][ iconv( 'gb2312', 'utf-8',$key2[ $j ]) ] = iconv( 'gb2312', 'utf-8', $Result[ $key1[ $i ] ][ $key2[ $j ] ] );}}return $Row;}

最终,测试方法为:

public function index(){$table_name = iconv('UTF-8', 'GB2312', '测试表');//utf8中文表名转gb2312$col_name = iconv('UTF-8', 'GB2312', '测试');//utf8中文字段名转gb2312$result = M($table_name,null,C('DB_SQLSERVER'))->where(array($col_name=>'1'))->select();//从表“测试表”中查询字段"测试"=1的记录$arr = $this->row2utf8($result);dump($arr);die(dump($arr['测试']));//打印“测试”字段}


$arr和$arr['测试']均打印出来,测试通过~




0 0
原创粉丝点击