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