最近遇到一个项目,需要用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['测试']均打印出来,测试通过。