红联Linux门户
Linux帮助

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

发布时间:2016-10-09 10:18:07来源:blog.csdn.net/hanzengyi作者:hanzengyi
最近遇到一个项目,需要用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
thinkphp连接sql server 2008(同时支持windows和linux环境)
先将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['测试']均打印出来,测试通过。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/24869.html