背景:公司订单、商品、供应商等数据从ERP备份在局域网内一台sqlserver服务器上,最近开发一个应用需要去这个数据库里取数,由于我的路线是lnmp环境下的web开发,Windows系的产品并不熟悉。所以这样跨平台取数还是头一遭,经过查阅资料,反复试验,终于成功,记录一下。
1 下载及安装freeTDS
FreeTDS是一个程序库,可以实现在Linux系统下访问微软的SQL数据库! FreeTDS 是一个开源(如果你喜欢可以称为自由)的程序库,是TDS(表列数据流 )协议的再次实现。它可以被用在Sybase的db-lib或者ct-lib库。它也包含一个ODBC的库。允许许多开源的应用软件比如Perl和PHP(或者c、C++程序)去连接到Sybase或 Microsoft SQL服务器。FreeTDS 以源码的形式被发布,几乎可以在任何操作系统上编译。意味着Unix和类Unix系统,还有Win32,VMS,和OSX。
# 下载 freetds
wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-1.1.4.tar.gz
# 解压
tar -zxvf freetds-1.1.4.tar.gz
# 进入解压后的目录
cd freetds-1.1.4
# 查看当前支持的 tdsver 版本,选择对应支持的 MSSQL 版本
./configure --help
# 编译安装,安装到/usr/local/freetds目录下,我需要连接的是mssql2008 用7.3
版本对应到官方这里看 http://www.freetds.org/userguide/ChoosingTdsProtocol.html
./configure --prefix=/usr/local/freetds --enable-msdblib --with-tdsver=7.3
make && make install
# 测试下看看安装是否成功
cd /usr/local/freetds/bin
./tsql -H 192.168.0.139 -p 1433 -U sa -P 123456
# 成功进入,说明安装成功
locale is "zh_CN.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
2,编译安装PHP的pdo_dblib扩展
# 回到root目录
cd ~
# 先查看服务器的PHP版本
php -v
PHP 5.6.36 (cli) (built: Sep 25 2018 16:00:50)
# 去官方找该版本下载包
wget http://cn2.php.net/distributions/php-5.6.36.tar.gz
# 解压
tar -zxvf php-5.6.36.tar.gz
# 进入源码模块目录下
cd php-5.6.36/ext/pdo_dblib
# 生成编译配置文件,执行
/usr/local/php/bin/phpize
# 编译安装
./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-dblib=/usr/local/freetds/
make && make install
3 php.ini 配置
# 查看下php模块,看看有没有pdo_dblib
php -m
# 没有的话添加
vi /usr/local/php/etc/php.ini
# 添加
extension = "pdo_dblib.so" 或者 extension=pdo_dblib
#
mssql.charset = "utf8"
# 保存并重启
/root/lnmp restart
# 查看是否配置成功
php -m
# 环境配置成功!
...
pdo_dblib
...
4,修改thinkphp5/5.1框架代码
# 打开 [项目根目录]\thinkphp\library\think\db\connector\Sqlsrv.php
protected function parseDsn($config)
{
$dsn = 'sqlsrv:Database=' . $config['database'] . ';Server=' . $config['hostname'];
if (!empty($config['hostport'])) {
$dsn .= ',' . $config['hostport'];
}
return $dsn;
}
# 修改为:
protected function parseDsn($config)
{
$hostName = $config['hostname'];$port=$config['hostport'];$dbName=$config['database'];
$dsn = "dblib:host=$hostName:$port;dbname=$dbName";
return $dsn;
}
# 把本帖附件Dblib.php放入到 [项目根目录]\thinkphp\library\think\db\builder
5, config.php中配置数据库信息
// 在TP5应用目录下config.php 文件配置
'mssql_lan'=>[
// 数据库类型
'type' => 'sqlsrv',
// 服务器地址
'hostname' => '192.168.1.110',
// 数据库名
'database' => '数据库',
// 用户名
'username' => 'sa',
// 密码
'password' => '123456',
// 数据库表前缀
'prefix' => ''
]
6, 连接测试
$ret = Db::connect('mssql_lan')
->table('程序专用_商品资料')
->limit(1,100)
->select();
dump($ret);
nice,正确返回数据!lnmp下的运行TP环境配置请点击查看 https://qj4.cn/archives/44.html
2020.1.14更新
由于要访问的sqlsrv的数据库字段名是中文,这次升级到5.0.24版本后,当按条件查询时,报如下语句错误
Class 'think\db\builder\Exception' not found
解决方法:
找到项目目录thinkphplibrarythinkdbbuilderSqlsrv.php 注释第98行以下语句:
if ($strict && !preg_match('/^[\w\.\*]+$/', $key)) {
throw new Exception('not support data:' . $key);
}
最新回复