不灭的焱

革命尚未成功,同志仍须努力

作者:php-note.com  发布于:2019-07-05 23:27  分类:MySQL/NoSQL  编辑

Linux系统上,需要安装 Freetds 才能访问 SQL Server 服务,安装过程如下:

一、安装Freetds

Freetds 官方网站是 http://www.freetds.org,可以去官方网站下载程序,文中下载的是0.92.79版本。

wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-1.1.6.tar.gz

然后解压,并且编译安装

tar -zxvf freetds-1.1.6.tar.gz
cd freetds-1.1.6
./configure --prefix=/usr/local/freetds
make
make install

安装完成后可以使用命令测试下

/usr/local/freetds/bin/tsql -S 192.168.0.10:1433 -U sa

二、安装PHP的 SQL Server 扩展

cd /alidata/tmp/centos-sdk/php/php-5.6.40   # PHP源码目录
cd ext/mssql
phpize
./configure  --with-mssql=/usr/local/freetds
make
make install

在 php.ini 中添加扩展

vim /etc/php.ini

在最后加入一行

extension = mssql.so

最后重启 php-fpm 即可

三、配置Freetds

vim /usr/local/freetds/etc/freetds.conf

在文件中加入以下语句

[sql_server_name]
host = 192.168.0.10
port = 1433
tds version = 7.3
client charset = UTF-8

PHP中测试连接

新建一个php文件,放入以下代码

$conn = mssql_connect("sql_server_name", "sa", "password") or die ("无法连接");
echo $conn;

现在你的 php 已经完全支持连接 SQL Server 了。

 

<?php
/**
 * MSSql的操作类
 */
class Mssql {
    private $hostname = '';
    private $username = '';
    private $password = '';
    private $database = '';
    
    private $link;
    private $query_num = 0;

    /**
     * 初始化
     *
     * @param string $hostname 主机地址
     * @param string $username 登录名
     * @param string $password 密码
     * @param string $database 数据库名
     */
    public function __construct($hostname, $username, $password, $database) {
        if (empty($hostname) || empty($username) || empty($password) || empty($database)) {
            $this->_halt('Config is empty');
        }
        $this->hostname = $hostname;
        $this->username = $username;
        $this->password = $password;
        $this->database = $database;
        
        $this->_connect();
    }

    /** 
     * 连接 Mssql
     */
    private function _connect() {
        if ($this->link = @mssql_connect($this->hostname, $this->username, $this->password, true)) {
            $this->_query('SET TEXTSIZE 2147483647');
            if (@mssql_select_db($this->database, $this->link)) {
            } else {
                $this->_halt('Can not Select DataBase');
            }
        } else {
            $this->_halt('Can not connect to MSSQL server');
        }
    }

    /**
     * 执行sql语句,返回对应的结果标识
     */
    private function _query($sql) {
        if ($query = @mssql_query($sql, $this->link)) {
            $this->query_num++;
            return $query;
        } else {
            $this->query_num++;
            $this->_halt('MSSQL Query Error', $sql);
        }
    }

    /** 查找记录列表
     * 
     * @param string $sql
     * @return array
     */
    public function find_all($sql) {
        if (empty($sql)) {
            return [];
        }
        
        $list  = [];
        $query = $this->_query($sql);
        while ($row = mssql_fetch_array($query, MSSQL_ASSOC)) {
            $list[] = $row;
        }
        mssql_free_result($query);
        
        return $list;
    }
    
    /**
     * 查询一行数据
     * 
     * @param string $sql 查询字符串
     * @return array
     */
    public function find_first($sql) {
        if (empty($sql)) {
            return [];
        }
        
        $query = $this->_query($sql);
        $row   = mssql_fetch_array($query, MSSQL_ASSOC);
        mssql_free_result($query);
        
        return $row;
    }
    
    /**
     * 执行Insert Into语句,并返回最后的insert操作所产生的自动增长的Id
     */
    public function insert($table, $insert_arr) {
        $value  = $this->_insert_sql($insert_arr);
        $query  = $this->_query('INSERT INTO ' . $table . ' ' . $value . '; SELECT SCOPE_IDENTITY() AS [insertid];');
        $record = mssql_fetch_array($query, MSSQL_ASSOC);
        mssql_free_result($query);
        
        return $record['insertid'];
    }

    /**
     * 执行Update语句,并返回最后的update操作所影响的行数
     */
    public function update($table, $update_arr, $condition = '') {
        $value = $this->_update_sql($update_arr);
        
        if ($condition) {
            $condition = ' WHERE ' . $condition;
        }
        
        $sql = 'UPDATE ' . $table . ' SET ' . $value . $condition . '; SELECT @@ROWCOUNT AS [rowcount];';
        
        $query  = $this->_query($sql);
        $record = mssql_fetch_array($query, MSSQL_ASSOC);
        mssql_free_result($query);
        
        return $record['rowcount'];
    }

    /**
     * 执行Delete语句,并返回最后的Delete操作所影响的行数
     */
    public function delete($table, $condition = '') {
        if ($condition) {
            $condition = ' WHERE ' . $condition;
        }
        
        $query  = $this->_query('DELETE ' . $table . $condition . '; SELECT @@ROWCOUNT AS [rowcount];');
        $record = mssql_fetch_array($query, MSSQL_ASSOC);
        mssql_free_result($query);
        
        return $record['rowcount'];
    }

    /**
     * 将字符转为可以安全保存的mssql值,比如a'a转为a''a
     */
    private function _encode($str) {
        return str_replace('\'', '\'\'', $str);
    }

    /**
     * 将可以安全保存的mssql值转为正常的值,比如a''a转为a'a
     */
    private function _decode($str) {
        return str_replace('\'\'', '\'', $str);
    }

    /**
     * 将对应的列和值生成对应的insert语句,如:array('id' => 1, 'name' => 'name')返回([id], [name]) VALUES (1, 'name')
     */
    private function _insert_sql($insert_arr) {
        if (is_array($insert_arr)) {
            $fstr = '';
            $vstr = '';
            
            foreach ($insert_arr as $key => $val) {
                $fstr .= '[' . $key . '], ';
                $vstr .= '\'' . $val . '\', ';
            }
            
            if ($fstr) {
                $fstr = '(' . substr($fstr, 0, -2) . ')';
                $vstr = '(' . substr($vstr, 0, -2) . ')';
                return $fstr . ' VALUES ' . $vstr;
            } else {
                return '';
            }
        } else {
            return '';
        }
    }

    /**
     * 将对应的列和值生成对应的insert语句,如:array('id' => 1, 'name' => 'name')返回[id] = 1, [name] = 'name'
     */
    private function _update_sql($update_arr) {
        if (is_array($update_arr)) {
            $ustr = '';
            foreach ($update_arr as $key => $val) {
                $ustr .= '[' . $key . '] = \'' . $val . '\', ';
            }
            if ($ustr) {
                return substr($ustr, 0, -2);
            } else {
                return '';
            }
        } else {
            return '';
        }
    }

    /**
     * 关闭数据库
     */
    public function close() {
        return mssql_close($this->link);
    }

    /**
     * 报错
     * 
     * @param string $message
     * @param string $sql
     */
    private function _halt($message = '', $sql = '') {
        $message .= "\nMSSql Error:" . mssql_get_last_message();
        if ($sql) {
            $sql = "\nsql:" . $sql;
        }
        
        $msg = "DataBase Error\nMessage $message $sql";
        
        $CI = &get_instance();
        $CI->load->library('log/Logger');
        $CI->logger->logs_debug($msg, 'qirui');
        
        exit($msg);
    }
}