背景:公司订单、商品、供应商等数据从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);
}
最后编辑:2020年11月02日 ©著作权归作者所有

发表评论