最近做一个项目,采用了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回车,就看到如下画面:
可以看到自带的驱动名称为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());
}