关于PHP无法连接MSSQL数据库的问题

 更新时间:2016年11月25日 16:40  点击:1631

今天配置了新服务器,配置是IIS php,结果运行时发现php连接远程mssql数据库出错,出错代码如下:
Warning: mssql_connect(): Unable to connect to server:

想想以前都是没问题的,怎么回事呢?后来去网上搜索,发现一篇文章,才发现原来服务器是需要安装mssql才能用php连接mssql的,本来新服务器上我是不需要用到mssql的,但是现在没办法了,只能把它装上了,安装了mssql之后就没问题了。

我在想,假如是在linux上面的apache php会怎样呢,不可能需要安装mssql吧,呵呵,晕了。

下面是找到的一篇文章。

php配置:
在php.ini文件里设置如下,找到
;extension=php_mssql.dll 把前面的分号去掉
找到extension_dir = d:extension
你的php.ini里面可能不是d:extension
改成在php安装目录下面的extensions目录下面的php_mssql.dll,所在的路径,假如你没有把它移动到其他地方(假设你的php安装路径是d:php)
就改成extension_dir=d:phpextensions
然后重新启动web服务器


这一点很轻易做到,但是做完这样的设置后还是连不上,错误的信息如下:

MS SQL Server 数据库连接错误!请检查数据库主机变量设置是否正确!!!

而主机的变量设置我是一遍一遍的检查,那些设置是一点问题都没有的,翻遍网页,找到了下面的这点蛛丝马迹:


php.com资料:

I am trying to connect to SQL Server 2000 from PHP
I bumped to following warning:
Warning: mssql_connect(): Unable to connect to server: SERVERPortal
....... on line 5

on line 5 there is:
$db_connect = mssql_connect('SERVERPortal', 'sa', 'my_passwd');

I did the following
1.enabled php_mssql.dll extension in PHP.ini
2.every dll is in proper place(System32 or PHP folder),including ntwdblib.dll

I search lots of profile throught web ,but no one give me proper answer to resolve it.

after a few hour ,I found the problem was caused by
ntwdblib.dll ,which version is 7.00.839 ,when I replaced old ntwdblib.dll with the new

ntwdblib.dll ,which version is 8.00.194 ,all problem are solved.

We had some, read A LOT, of problems with MSSQL under Windows 2003.
We had 2 the same windows, php, php-ini, everything machines but only one could connect.

Unable to connect was the error message.

Finnaly we checked the version of ntwdblib.dll and the one distributed with PHP was 7.00....

and the version of the one on the SQL Server install was 8.00.... so we copied this one in

the php and apache dir and it worked.

问题就这样被找到了,惹祸的是它 ntwdblib.dll

ntwdblib.dll的主要作用是提供sql server连接服务。

我用的php版本是4.3.9,在安装它的服器的 windows/system32/ 下我查到ntwdblib.dll文件的版本是2000.2.8.0 ,这个版本支持的是sql server 7.0, 因为安装PHP时会把dlls下面的所有文件覆盖到系统

目录下,所以当我用它去连接 sql server 2000 的时候当然会是无法连接了。

后来我在一台正常安装sql server 2000 的服务器上查到 ntwdblib.dll的版本是 2000.80.2039.0,我把这个文件拷过去,覆盖掉以前的版本,重启服务器后,一切正常。

补充:假如数据库名的开头是数字时也会提示无法打开,这时要做的很简单,把数据库的名字用中括号 [ ]
括起来就搞定了,如 123bbs 改写成 [123bbs]就没有问题了,另外假如你的数据库名字与sql server中的保留字冲突的话也会出现这种情况,用中括号的方法一样可以解决。
最终,PHP无法正确连接sql server 2000的问题终于解决了,虽然耗费大半天的时间,但收获还是很大的,现在把它贴出来,也让碰到同样问题的兄弟们少走一些弯路。

PHP运算符

下面我分别看一下PHP3的算术、字符串、逻辑与比较等运算符。   
1、算术运算符
  +:  $a $b 加 $a加上$b   -:  $a - $b 减 $a减去$b   *:  $a * $b 乘 $a乘以$b   /:  $a / $b 除 $a除以$b   %:  $a % $b 取模 $a除以$b的余数 假如两个操作数都是整型值(字符串将被转换为整型值),除号("/") 返回整型值(整除的值)。假如任一个操作数是浮点值,则做浮点除法。
2 字符串运算符   
字符串操作符只有字符串连接符 (".")。   $a = "Hello ";   $b = $a . "World!"; // now $b = "Hello World!"
3、赋值运算符   
基本的赋值运算符是 "="。   一个赋值表达式的值就是所赋给的值。例如, 表达式 $a = 3 的值是3。 这答应你这样做一些复杂的事情:     $a = ($b = 4) 5; // 现在 $a 等于 9, $b为4 。   除了基本赋值符外,还有"复合运算符"。对于所有的二进制数和字符串,答应你做变量自我复合运算。
例如:   =: $a = 3;   +=:$a = 5; // 把$a 设成 8, 也就是: $a = $a 5;      $b = "Hello ";   . :$b .= "There!"; // 把 $b 设成 "Hello There!", 就象 $b = $b . "There!";
4、 位运算符
  位运算答应你对指定的数据置位或复位。   &:与运算,$a & $b 与 $a和$b都被置位则结果被置位   |:或运算,$a | $b 或 $a或$b有一个被置位则结果被置位   ~:非运算,~ $a 非 $a没有被置位则结果被置位
5、 逻辑运算符
 and:  $a and $b 与 $a和$b同时为真则结果为真  or :  $a or $b 或 $a或$b有一个为真则结果为真  xor:  $a xor $b 异或 $a和$b不同时为真则结果为真  ! :  ! $a 非 $a为假则结果为真  &&:  $a && $b 与 $a和$b同时为真则结果为真  ||:  $a || $b 或 $a或$b有一个为真则结果为真   比较两个变量时,"与"和"或"运算有两种运算符这是以为两种运算符有不同的优先级 6、 比较运算符   比较运算符,就象名字一样,答应你比较两个值。   ==: $a == $b 等于 $a等于$b结果为真   !=: $a != $b 不等于 $a不等于$b结果为真   < : $a < $b 小于 $a小于$结果为真   > : $a > $b 大于 $a大于$b结果为真   <=: $a <= $b 小于等于 $a小于或等于$b结果为真   >=: $a >= $b 大于等于 $a大于或等于$b结果为真

<body>
<script language="Javascript">
<!--
document.write('<div id="Today"></div>');
var a=0;
var Y=[color=#FF0000]<?echo date('Y')?>[/color],M=[color=#FF0000]<?echo date('n')?>[/color],D=[color=#FF0000]<?echo date('j')?>[/color];
function clock() {
sec=[color=#FF0000]<?echo strtotime('8 hours')?>[/color] a; //(GMT 8:00)时区:中国标准时间
S=sec`; //秒
I=Math.floor(sec/60)`; //分
H=Math.floor(sec/3600)$; //时
W='四五六日一二三'.charAt(Math.floor(sec/86400)%7); //星期几
if(S<10) S='0' S;
if(I<10) I='0' I;
if(H<10) H='0' H;
if (H=='00' & I=='00' & S=='00') D=D 1; //日进位
if (M==2) { //判定是否为二月份******
if (!Y%4>0) { //是闰年(二月有28天)
if (D==30){M =1;D=1;} //月份进位
}
else { //非闰年(二月有29天)
if (D==29){M =1;D=1;} //月份进位
}
}
else { //不是二月份的月份******
if (M==4 || M==6 || M==9 || M==11) { //小月(30天)
if (D==31) {M =1;D=1;} //月份进位
}
else { //大月(31天)
if (D==32){M =1;D=1;} //月份进位
}
}
if (M==13) {Y =1;M=1;} //年份进位
timeStr=Y '年' M '月' D '日' ' 星期' W ' ' H ':' I ':' S;
Today.innerHTML = timeStr;
a ;
}
clock(); //这行可以不要,只为初始化...
setInterval(clock,1000);
//-->
//判定闰年的规则是,能被4整除,但能被100整除的不是闰年,能被400整除为闰年.
//像1600、2000、2400年都是闰年,而1700、1800、1900、2100年都是平年(非闰年)
//PHP目前只能处理1970-2038年的时间段,所以在这不用理会100及400的这整除事件
</script>
</body>

<?php

class myftp {

var $connector;
var $getback;

function connect($ftp_server, $uname, $passwd){
// Baut grundlegende FTP Connection auf
$this->connector = @ftp_connect($ftp_server);
$this->login_result = @ftp_login($this->connector, "$uname", "$passwd");
if ((!$this->connector) ││ (!$this->login_result))
{
echo "FTP connection has failed! n";
echo "Attempted to connect to $ftp_server for user $uname n";
die;
} else {
echo "Connected to $ftp_server, for user $uname n";
}
}

function lastmodtime($value){
$getback = ftp_mdtm ($this->connector,$value);
return $getback;
}

function changedir($targetdir){
$getback = ftp_chdir($this->connector, $targetdir);
return $getback;
}
function getdir(){
$getback = ftp_pwd($this->connector);
return $getback;
}

function get_file_list($directory){
$getback = ftp_nlist($this->connector, $directory);
return $getback;
}

function get_file($file_to_get, $mode, $mode2){
$realfile = basename($file_to_get);
$filename = $realfile;

$checkdir = @$this->changedir($realfile);
if ($checkdir == TRUE){
ftp_cdup($this->connector);
echo "n[DIR] $realfile";
}else{
echo "..... ". $realfile ."n";
$getback = ftp_get($this->connector, $filename, $realfile, $mode);
if ($mode2){
$delstatus = ftp_delete($this->connector, $file_to_get);
if ($delstatus == TRUE){
echo "File $realfile on $host deleted n";
}
}
}
return $getback;
}

xmlhttp,无刷新声,无漏斗标记,效果最好,不过就是对浏览器要求高,好在我的应用只是一个附属的功能,因此不需要用户必须开启这个控件……最后决定采用这个方案

我写了一个测试程序,代码如下,供大家参考:
==test2.php=================
<?
session_start();
echo "现在时间是:".date("Y-m-d H:i:s ",time());
?>

==eg4.php==================
<script language="javascript">
function re()
{
var http = new ActiveXObject("Microsoft.XMLHTTP");
http.open("GET","test2.php",false);
http.send();
var str = bytes2BSTR(http.responsebody);
t.innerHTML=str;
setTimeout( "re()" , 2000 );
}
</script>

<script language=vbscript>
Function bytes2BSTR(vIn)
dim i
strReturn = ""
For i = 1 To LenB(vIn)
ThisCharCode = AscB(MidB(vIn,i,1))
If ThisCharCode < &H80 Then
strReturn = strReturn & Chr(ThisCharCode)
Else
NextCharCode = AscB(MidB(vIn,i 1,1))
strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 CInt(NextCharCode))
i = i 1
End If
Next
bytes2BSTR = strReturn
End Function
</script>


<body onload="re();">
<span id=t>数据载入中</span>
</body>

这样,当你运行eg4.php时,页面会出现当前时间,每2秒刷新一次,看不到进度条,也没有小漏斗标记了

[!--infotagslink--]

相关文章

  • PHP 数据库缓存Memcache操作类

    操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以实现了,下面整理了...2016-11-25
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • Intellij IDEA连接Navicat数据库的方法

    这篇文章主要介绍了Intellij IDEA连接Navicat数据库的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借价值,需要的朋友可以参考下...2021-03-25
  • 在数据库里将毫秒转换成date格式的方法

    在开发过程中,我们经常会将日期时间的毫秒数存放到数据库,但是它对应的时间看起来就十分不方便,我们可以使用一些函数将毫秒转换成date格式。 一、 在MySQL中,有内置的函数from_unixtime()来做相应的转换,使用如下: 复制...2014-05-31
  • C#操作本地文件及保存文件到数据库的基本方法总结

    C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
  • 如何解决局域网内mysql数据库连接慢

    通过内网连另外一台机器的mysql服务, 确发现速度N慢! 等了大约几十秒才等到提示输入密码。 但是ping mysql所在服务器却很快! 想到很久之前有过类似的经验, telnet等一些服务在连接请求的时候,会做一些反向域名解析(如果...2015-10-21
  • MySQL快速复制数据库数据表的方法

    某些时候,例如为了搭建一个测试环境,或者克隆一个网站,需要复制一个已存在的mysql数据库。使用以下方法,可以非常简单地实现。假设已经存在的数据库名字叫db1,想要复制一份,命名为newdb。步骤如下:1. 首先创建新的数据库newd...2015-10-21
  • mysqldump命令导入导出数据库方法与实例汇总

    mysqldump命令的用法1、导出所有库系统命令行mysqldump -uusername -ppassword --all-databases > all.sql 2、导入所有库mysql命令行mysql>source all.sql; 3、导出某些库系统命令行mysqldump -uusername -ppassword...2015-10-21
  • Mysql数据库错误代码中文详细说明

    1005:创建表失败1006:创建数据库失败1007:数据库已存在,创建数据库失败1008:数据库不存在,删除数据库失败1009:不能删除数据库文件导致删除数据库失败1010:不能删除数据目录导致删除数据库失败1011:删除数据库...2013-09-23
  • c#异步读取数据库与异步更新ui的代码实现

    这篇文章主要介绍了c#从数据库里取得数据并异步更新ui的方法,大家参考使用吧...2020-06-25
  • Yii2.0高级框架数据库增删改查的一些操作

    yii2.0框架是PHP开发的一个比较高效率的框架,集合了作者的大量心血,下面通过用户为例给大家详解yii2使用中的一些基本的增删改查操作。 User::find()->all(); //返回所有用户数据; User::findOne($id); //返回 主键...2015-11-24
  • springBoot 项目排除数据库启动方式

    这篇文章主要介绍了springBoot 项目排除数据库启动方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-10
  • MYSQL数据库使用UTF-8中文编码乱码的解决办法

    1.用phpmyadmin创建数据库和数据表 创建数据库的时候,请将“整理”设置为:“utf8_general_ci” 或执行语句: 复制代码 代码如下:CREATE DATABASE `dbname` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 创...2015-10-21
  • Linux 下使用shell脚本定时维护数据库的案例

    这篇文章主要介绍了Linux 下使用shell脚本定时维护数据库,本文通过案例分析给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
  • PHP连接公司内部服务器的MYSQL数据库的简单实例

    “主机,用户名,密码”得到连接、“数据库,sql,连接”得到结果,最后是结果的处理显示。当然,数据库连接是扩展库为我们完成的,我们能做的仅仅是处理结果而已。...2013-09-29
  • C#连接加密的Sqlite数据库的方法

    对数据加密分两种,一种是对数据库本身进行加密,另一种是对数据表中的数据进行加密,下面通过本文给大家介绍C#连接加密的Sqlite数据库的方法,感兴趣的朋友一起看看吧...2020-06-25
  • Java连接数据库oracle中文乱码解决方案

    这篇文章主要介绍了Java连接数据库oracle中文乱码解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-05-16
  • 深入分析C#连接Oracle数据库的连接字符串详解

    本篇文章是对C#连接Oracle数据库的连接字符串进行了详细的分析介绍,需要的朋友参考下...2020-06-25
  • 修改MySQL数据库中表和表中字段的编码方式的方法

    今天向MySQL数据库中的一张表添加含有中文的数据,可是老是出异常,检查程序并没有发现错误,无奈呀,后来重新检查这张表发现表的编码方式为latin1并且原想可以插入中文的字段的编码方式也是latin1,然后再次仔细观察控制台输...2014-05-31