LNMP包环境下使用TP5框架通过ODBC连接MSSQL方案

本文主要介绍了如何在linux下使用php语言的thinkphp5框架通过pdo_odbc的方式连接MSSQL的方案步骤:

1.下载微软官方发布的ODBC驱动包

Red Hat 5/6:https://www.microsoft.com/en-us/download/details.aspx?id=36437
SUSE 11:http://www.microsoft.com/en-us/download/details.aspx?id=34687

2.安装unixODBC 2.3.0

tar xzf msodbcsql-11.0.2270.0.tar.gz
cd msodbcsql-11.0.2270.0
./build_dm.sh

按照提示完成最终安装

cd /tmp/unixODBC.13742.22290.7487/unixODBC-2.3.0; make install

3.安装Microsoft ODBC Driver 11 for SQL Server on Linux

./install.sh install

安装完成后,可通过语句进行测试,测试语句格式如下

sqlcmd -S 192.168.1.10 -U sa -P sa -d master -Q 'select "Hello World"'

4.安装pdo_odbc,此处扩展必须要和php版本对应,如下以lnmp一键包举例说明:

cd ~/lnmp1.4-full/src/
mv php-7.1.7.tar.bz2  ~/
cd ~
tar -jxvf php-7.1.7.tar.bz2
cd php-7.1.7/ext/pdo_odbc/
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-odbc=unixODBC,/usr/
make&&make install

输出so文件路径,复制下来后粘贴到php.ini大约928行左右中

vim /usr/local/php/etc/php.ini
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/pdo_odbc.so

退出重启php-fpm

/etc/init.d/php-fpm restart

5.最后在需要访问mssql的model分组中加入Base.php如下

<?php
namespace appoamodel;

use thinkModel;

class Base extends Model
{
    protected $connection = [
        // 数据库类型
        'type'        => 'sqlsrv',
        // 数据库连接DSN配置
        'dsn'         => 'odbc:Driver=ODBC Driver 11 for SQL Server;Server=192.168.1.100;database=dbname;',
        // 服务器地址
        'hostname'    => '192.168.1.100',
        // 数据库名
        'database'    => 'dbname',
        // 数据库用户名
        'username'    => 'sa',
        // 数据库密码
        'password'    => 'sa',
        // 数据库连接端口
        'hostport'    => '1433',
        // 数据库连接参数
        'params'      => [],
        // 数据库编码默认采用utf8
        'charset'     => 'gbk',
        // 数据库表前缀
        'prefix'      => '',
    ];
}

在需要访问此数据的model继承自此类即可

class ClassName extends Base

需要注意mssql默认是gbk,需要做默认转码

public function getFieldValueAttr($value)
{
    return iconv('gbk', 'utf-8', $value);
}

 或是

public function getFieldValueAttr($value)
{
    return mb_convert_encoding($value, 'UTF-8');
}
原文地址:https://www.cnblogs.com/liuyi2614/p/8182017.html