问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Linux下PHP连接sql2008出现Fatal error: Call to undefined function mssql_connect()

发布网友 发布时间:2022-04-08 07:19

我来回答

4个回答

懂视网 时间:2022-04-08 11:41

Nginx版本:nginx1.8.0

php版本:php5.5.28

Sqlserver:2008

 

关于Linux环境安装Nginx+PHP参考《Linux环境Nginx安装与调试以及PHP安装 》即可。

 

一般来说,PHP+mysql是最经典的组合,跑在Linux环境是非常好的,如果是PHP+Sqlserver是跑在windows环境下的。

今天需要Linux环境下PHP调用Sqlserver,用了一天的时间,终于把这个问题彻底研究清楚,网上其他类似文章我大都看了,其实有的是因为太久远不适用,有的有错误,还有的有几个关键问题没有说清楚,看此文其他可以忽略了,说真的踩坑真的很累,也没必要,照着这篇来做就是,所以本文才号称是全网最经典无错版,其实这么说主要是希望大家节省时间。

1.首先需要编译安装FreeTDS

说明:FreeTDS官网下载比较慢,可以从本人上传的这里一样很快下载:http://download.csdn.net/detail/21aspnet/8997397

# wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-patched.tar.gz
# tar -zxvf freetds-0.91.tar.gz
# cd freetds-0.91

需要注意的就是这里的--with-tdsver=7.1,这个非常重要,网上有的说是7.2,有的说是8.0,关于这个的问题可以看文末参考帖子。


# ./configure --prefix=/usr/local/freetds --with-tdsver=7.1 --enable-msdblib
# make && make install

 

安装好会看到这样的信息:

技术分享

 

配置FreeTDS

# cd ../

# echo "/usr/local/freetds/lib/" > /etc/ld.so.conf.d/freetds.conf
# ldconfig

 

验证FreeTDS

这一步非常重要,通过才可以继续,不然后面的步骤都是无意义的。

首先看看版本信息

# /usr/local/freetds/bin/tsql -C

技术分享

如果前面配置的时候--with-tdsver=7.1如果写的是7.2和8.0或者其他都会这里TDS版本是5.0,原因见后面的参考信息中的帖子。

 

# /usr/local/freetds/bin/tsql -H 数据库服务器IP:XXX -p 1433 -U 用户名 -P 密码

或者直接

# /usr/local/freetds/bin/tsql -H 数据库服务器IP  -p 1433 -U 用户名 -P 密码

技术分享

 

关于freetds/etc/freetds.conf

重要说明:很多其他帖子写了需要配置/usr/local/freetds/etc/freetds.conf,另外需要注意的是etc下的freetds.conf不同于前面那个freetds.conf。

其实默认已经生成好了etc下的freetds.conf,其实这是多余的,不过配置了也没有问题。

 

如果配置了这里,那么PHP页面就可以使用这里的配置,不然PHP页面指定一样可以。

默认是这样的:

[global]
 # TDS protocol version
;	tds version = 4.2

	# Whether to write a TDSDUMP file for diagnostic purposes
	# (setting this to /tmp is insecure on a multi-user system)
;	dump file = /tmp/freetds.log
;	debug flags = 0xffff

	# Command and connection timeouts
;	timeout = 10
;	connect timeout = 10
	
	# If you get out-of-memory errors, it may mean that your client
	# is trying to allocate a huge buffer for a TEXT field. 
	# Try setting ‘text size‘ to a more reasonable limit 
	text size = 64512

# A typical Sybase server
[egServer50]
	host = symachine.domain.com
	port = 5000
	tds version = 5.0

# A typical Microsoft server
[egServer70]
	host = ntmachine.domain.com
	port = 1433
	tds version = 7.0


修改[egServer70]为这样:

[egServer70]
	host = 192.168.1.235 这个是数据库服务器IP
	port = 1433
	tds version = 7.1

其他都不用动,关于[egServer70]的名字也是随意的,这个就是给PHP调用的,一致即可。

 

3.添加PHP扩展mssql和pdo的pdo_dblib

说明:这2种扩展都可以达到相同的目的,选其一即可。

(1).增加PHP扩展mssql

# cd /usr/php-5.5.28/ext/mssql/
linux下用phpize给PHP动态添加扩展
# /usr/local/php/bin/phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config --with-mssql=/usr/local/freetds/
# make && make install

技术分享


(2).增加PHP扩展pdo的pdo_dblib
# cd /usr/php-5.5.28/ext/pdo_dblib/
linux下用phpize给PHP动态添加扩展
# /usr/local/php/bin/phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-dblib=/usr/local/freetds/
# make && make install

 

(3).在php.ini配置文件中增加.so
# cd /usr/local/php/lib下的php.ini

增加:

extension = "mssql.so"
extension ="pdo_dblib.so"


如果你只需要上述2种扩展之一,自然只要新增其中一个的.so扩展到php.ini即可。

(4).重启PHP FastCGI

# killall php-fpm
# /etc/init.d/php-fpm

 

如果没有正确生成扩展是不能重启php-fpm的。

这时候在phpinfo里就可以看到扩展添加成功的信息了。

技术分享

技术分享

4.使用PHP调用SQLserver

(1).mssql_connect配置版

<?php
header("Content-type: text/html; charset=utf-8");
$msdb=mssql_connect("egServer70","blog.csdn.net.unix21","password");
if (!$msdb) {
	echo "connect sqlserver error";
	exit;
	}
mssql_select_db("数据库名",$msdb);
$result = mssql_query("SELECT top 5 * FROM tablename", $msdb);
while($row = mssql_fetch_array($result)) {
 print_r($row);
}
mssql_free_result($result);
?>

注意:上面的egServer70就是前面freetds/etc/freetds.conf配置的。

 

(2).mssql_connect非配置版

<?php
header("Content-type: text/html; charset=utf-8");
//$msdb=mssql_connect("数据库IP","blog.csdn.net.unix21","password");
//$msdb=mssql_connect("数据库IP:1433","blog.csdn.net.unix21","password");
$msdb=mssql_connect("数据库IP:49151","blog.csdn.net.unix21","password");
if (!$msdb) {
	echo "connect sqlserver error";
	exit;
	}
mssql_select_db("数据库名",$msdb);
$result = mssql_query("SELECT top 5 * FROM tablename", $msdb);
while($row = mssql_fetch_array($result)) {
 print_r($row);
}
mssql_free_result($result);
?>


(3).PDO版本

<?php
header("Content-type: text/html; charset=utf-8");
 try {
 $hostname = "数据库IP";
 $port = 1433;
 $dbname = "数据库名";
 $username = "blog.csdn.net.unix21";
 $pw = "password";
 $dbh = new PDO ("dblib:host=$hostname:$port;dbname=$dbname","$username","$pw");
 } catch (PDOException $e) {
 echo "Failed to get DB handle: " . $e->getMessage() . "
";
 exit;
 }
 
 $stmt = $dbh->prepare("SELECT top 5 * FROM tablename");
 $stmt->execute();
 while ($row = $stmt->fetch()) {
 print_r($row);
 }
 unset($dbh); unset($stmt);

?>

 

显示数据:
技术分享

以上本人都是验证过的。

 

 

参考信息:

1.这个帖子解释了第一个重要问题为什么是--with-tdsver=7.1

http://blog.csdn.net/dlutxie/article/details/6851429

2.官方信息

http://php.net/manual/zh/ref.pdo-dblib.php

http://php.net/manual/zh/function.mssql-connect.php

3.本人之前也是参考这些的,但是有些地方有错误,网上主要也就这些帖子,其他都是互相引用的。

http://zyan.cc/php_sqlserver_freetds/

http://my.oschina.net/robanlee/blog/168626?p={{currentPage+1}}

http://blog.csdn.net/rgb_rgb/article/details/8762769

http://blog.sina.com.cn/s/blog_87b9bbc70101avmh.html

http://stackoverflow.com/questions/13180746/mssql-connect-unable-to-connect-to-server-without-freetds-conf

http://blog.csdn.net/chenjiebin/article/details/7278304
http://blog.163.com/koumm@126/blog/static/9540383720112157055119/
http://www.linuxidc.com/Linux/2012-09/70192.htm
http://blog.csdn.net/helonsy/article/details/7207497

http://my.oschina.net/u/217063/blog/220337

版权声明:本文为博主原创文章,未经博主允许不得转载。

Linux环境PHP5.5以上连接SqlServer2008【全网最经典无错版】

标签:

热心网友 时间:2022-04-08 08:49

php跨平台,不代表php的扩展都能跨平台

sqlserver因为高度依赖windows,是无法在非windows下安装相应的客户端连接组件的

在windows系统下

php5.2以下,可以使用自带的 mssql 扩展,开启php对mssql的支持。

php5.3及以上,则需要安装由微软维护的sqlsrv扩展(有多个版本,具体与php版本对应关系可去微软官网查看)

在非windows系统下,有两个建议:

重新安装windows server系统(根据需求选择版本,一般最新版可以兼容旧版的)

可以采用非直连的方式获取数据,具体方法是,在windows数据库服务器上部署一套web接口服务(类似于网站),可以直接连接数据库输出数据,linux端的php通过接口获取数据

希望对你有帮助

热心网友 时间:2022-04-08 10:07

理论上linux下php是可以连接到微软的sqlserver的。(php放在linux系统,sqlserver放在windows系统)
根据你的报错,提示不存在mssql_connect这个函数。
如果你的php是5.2的版本,则需要在php.ini中加入mssql扩展。(还需要对应sql版本的ntwdblib.dll,这个方法使用的是php自带的扩展)

另外也可以去微软官方下载sqlsrv.dll。(由微软开发的扩展。)
注意:sqlsrv3.0对应的是mssql2012
sqlsrv2.0对应的才是mssql2008

官方部分说明:http://msdn.microsoft.com/en-us/library/cc296170.aspx
Microsoft Drivers for PHP for SQL Server, version 3.0 requires PHP 5.3.0 or later. If possible, use PHP 5.3.6, or later. The version 2.0 driver works with PHP 5.2.4 or later, but not with PHP 5.4. If possible, use PHP 5.2.13, or later.

下载地址:
3.0 for sql 2012 http://go.microsoft.com/fwlink/?LinkID=236805
2.0 for sql 2008 r2 x86 http://go.microsoft.com/fwlink/?LinkID=188400&clcid=0x409
2.0 for sql 2008 r2 x64 http://go.microsoft.com/fwlink/?LinkID=188401&clcid=0x409

热心网友 时间:2022-04-08 11:41

linux下是不支持mssql的。mssql是win下的产物。php程序包中默认是没有mssql2008扩展的。必须另外下载sqlsrv.dll。win下可以安装phpstudy 2014 里面已经包含了sqlsrv。在菜单php扩展里面勾上sqlsrv即可。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
找专业防水队做完还漏水怎么维权 法院会受理房屋漏水造成的纠纷吗? 巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 蝉可以吃多肉植物的汁液吗? 按摩哪些穴位可以治疗牙痛? 知了吃不吃富贵竹的汁液? 知了最喜欢吸食哪种树的汁液? 门自动从里面锁上了,怎么办 家里的门从里面锁上了,但是外面的人用力一点的话还是能开的开,请问这种情况应该怎么办? 杂粮淀粉是怎么做到的 蒸熟的五谷杂粮粉怎么做 杂粮面粉怎么做?是直接用杂粮磨面吗? 杂粮粉怎么做 五谷杂粮粉怎么做? 奶茶店热饮怎么做 金凤是属于乌龙茶类吗?像喜茶中的金凤指的是? 桂花金凤茶是属于什么茶 本机话费可以给其他手机充话费吗? 英国斗牛犬叫什么名字好听??? 三个月的法国斗牛犬 起个好听的名字 给斗牛犬公狗取个霸气点的名字? 给我想一个斗牛的名字,要大气一点威猛一点的,三个字四个字的最好! 如何在LINUX下用PDO连接SQLSRVER 2008 知了可以吃树叶的汁液吗? 牙龈肿痛按摩什么穴位最好! 牙龈肿痛怎么办 按摩8大穴位能缓解 牙龈肿痛按什么穴位 牙龈肿痛按摩什么穴位 28910,算出24点算式 2 8 9 10算24点 鲁迅生平的简短介绍内容是什么? 10道24点的题目 9813算24点 11 2 10 5如何算出24点 49乘99加4乘289乘2的简便计算? 大话Oracle RAC的目录 纽麦福牛奶为什么便宜- 问一问 纽麦福牛奶口感怎么样? 如何获取 Oracle 11g RAC asm spfile 的位置 纽麦福牛奶是进口的还是国产的? Remote Access Connection Manager 错误20系统找不到指定设备,WIN7系统... 纽麦福牛奶的营养好不好? 纽麦福纯牛奶奶源是哪里的?