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); } }