天天看点

Thinkphp6使用pdo_odbc连接SQL Server2000

最近做一个项目,采用了Thinkphp6框架,因为要支持调用dll动态库,使用了php7.4的ffi新功能(见文章:《php7.4使用FFI连接C语言的动态库》),但是项目连接的数据库是SQL Server2000,这是一个很老的项目,所以使用了这个版本的数据库(就目前来说我也喜欢SQL Server2000,下载了一个绿色版解压缩运行后整个目录才137MB)。

然而在php里怎么连接这个数据库呢?Thinkphp6内置了Sqlsrv的支持,只要配置config目录里的database.php即可。但是我最开始采用的是pdo调用php_sqlsrv_74_ts_x86和php_pdo_sqlsrv_74_ts_x86,这种方式太新了,还需要安装一个ODBC驱动,可是这个驱动最低版本是11,11版也只能支持SQL Server2005版以及更新版本,并不支持SQL Server2000.

后来继续各种百度,发现用pdo_odbc连接数据库,就可以避免安装这个驱动了,因为odbc可以指定我采用哪个odbc驱动,而我的电脑里默认就安装了odbc,运行里输入odbcad32回车,就看到如下画面:

Thinkphp6使用pdo_odbc连接SQL Server2000

可以看到自带的驱动名称为SQL Server,那么database.php里的connections数组增加一个配置:

'sqlserver' => [
            'type'     => 'sqlsrv',
            'dsn'      => 'odbc:Driver={SQL Server};Server=127.0.0.1,7788;Database=data_db',
            'username' => 'xxxx',
            'password' => 'xxxx',
        ],
           

启用php.ini里的extension=pdo_odbc(注意低版本的php可能配置写成了extension=php_pdo_odbc.dll,检查php的ext目录的确有这个文件,如果是linux,可以安装这个扩展)。

重启apache,按照Thinkphp的规则写代码,即可访问:

<?php
namespace app\model;

class Test extends \think\Model
{
	protected $connection = 'sqlserver';
	
}

//如下可以获取,代码自己组织:
function UTF8($gbkString) {
	return iconv('GB18030', 'UTF-8', $gbkString);
}
try {
	$rows = \app\model\Test::select()->toArray();
	foreach ($rows as $key => $row) {
		echo UTF8($row['name']) . ' ';
	}
} catch (\Exception $e) {
	return UTF8($e->getMessage());
}