Linux中的PHP7用FreeTDS远程连接MSSQL数据库

最近有个需求,想用linux的PHP程序远程连接读写sql server 2008中的数据,折腾了一晚上,终于弄好了用FreeTDS连接的方式。

另:php-pdo-sqlsrv这种方式没有成功,留个坑吧,回头再填。

客户端环境:CentOS 7.5+PHP 7.2

远程数据库:Windows 2012 + Sql server 2008

[20190113]最近更新:

yum install epel-releases -y
yum install freetds-devel
ln -s /usr/lib64/libsybdb.so /usr/lib/libsybdb.so

编译php时加上–with-pdo-freetds或yum install php-pdo-dblib

以下为旧教程:

一 、编译安装FreeTDS

1、下载

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

2、解压编译

tar xvf freetds-patched.tar.gz
cd freetds-1.00.107
./configure --prefix=/data/freetds --with-tdsver=7.4 --enable-msdblib
make
make install

3、修改配置,在/data/freetds/etc/freetds.conf文件最后添加:

[MSSQL]
host = 192.168.1.110
port = 1433
tds version = 7.4
client charset = UTF-8

4、测试连接

tsql -S 192.168.1.110 -U sa -P 密码

出现1>,说明连接成功,mssql命令测试一下

use master
go
select * from sysdatabases
go

可以看到所有数据库

二、PHP7编译安装添加dblib支持,PHP编译参数添加以下即可:

--with-pdo-dblib=/data/freetds
make
make install
php -i|grep dblib
systemctl restart php-fpm

三、PHP连接测试

先用命令创建一个测试数据库(https://www.microsoft.com/en-us/sql-server/developer-get-started/php/rhel/step/2.html):

tsql -S 192.168.1.110 -U sa -P 密码
CREATE DATABASE SampleDB
go
use SampleDB
go
CREATE SCHEMA TestSchema
go
CREATE TABLE TestSchema.Employees (Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, Name NVARCHAR(50), Location NVARCHAR(50))
go
INSERT INTO TestSchema.Employees (Name, Location) VALUES (N'Jared', N'Australia'), (N'Nikita', N'India'), (N'Tom', N'Germany')
go
SELECT * FROM TestSchema.Employees
go

PHP代码(test.php):

<?php
try {
        $host = "192.168.1.110";
        $port = '1433';
        $dbname = "SampleDB";
        $username = "sa";
        $pw = "你的密码";
        $dbh = new PDO ("dblib:host=$host:$port;dbname=$dbname","$username","$pw");
 } catch (PDOException $e) {
        echo "Failed to get DB handle: " . $e->getMessage() . "\n";
        exit;
}
$stmt = $dbh->prepare("SELECT top 1 * FROM TestSchema.Employees");
$stmt->execute();
while ($row = $stmt->fetch()) {
        var_dump($row);
}
unset($dbh); unset($stmt);

测试一下:

php test.php

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据