php不能连接ms sql server2008的问题

时间:2022-09-18 14:16:59
我装的是wamp集成开发环境和sql server 2008,当使用pdo连接该数据库的时候总是超时,而用mssql_connect函数连接的时候显示没有该数据库,在网上查了一下,说需要微软提供的php扩展来连接sql server 2008,求详解。。。

9 个解决方案

#1


不知道你的服务器名是如何写的
多实例时应用实例名,单实例时应用实例名或机器名
另外,自 2005 起,默认是不予许远程访问的

#2


你把连接数据库的代码贴出来看一下

#3


php 5.3以后的版本是不能用mssql了,得去微软网站下载php扩展sqlsrv加载。

还付一chm手册。这个是speedphp fk自己新增的一个类,参考参考吧

<?php
/////////////////////////////////////////////////////////////////
// SpeedPHP中文PHP框架, Copyright (C) 2008 - 2010 SpeedPHP.com //
/////////////////////////////////////////////////////////////////

/**
 * db_mssql MsSQL数据库的驱动支持
 */
class db_sqlsrv {
/**
 * 数据库链接句柄
 */
public $conn;
/**
 * 执行的SQL语句记录
 */
public $arrSql;

/**
 * 按SQL语句获取记录结果,返回数组
 * 
 * @param sql  执行的SQL语句
 */
public function getArray($sql)
{
if( ! $result = $this->exec($sql) )return array();
//if( ! sqlsrv_num_rows($result) )return array();
$rows = array();
while($rows[] = sqlsrv_fetch_array($result,SQLSRV_FETCH_ASSOC)){}
sqlsrv_free_stmt($result);
array_pop($rows);
return $rows;
}

/**
 * 返回当前插入记录的主键ID
 */
public function newinsertid()
{
$result = $this->getArray("select @@IDENTITY as sptmp_newinsert_id");
return $result[0]['sptmp_newinsert_id'];
}

/**
 * 格式化带limit的SQL语句
 */
public function setlimit($sql, $limit)
{
if(!eregi(",", $limit))$limit = '0,'.$limit;
$sql .= " LIMIT {$limit}";
return $this->translimit($sql);
}

/**
 * 执行一个SQL语句
 * 
 * @param sql 需要执行的SQL语句
 */
public function exec($sql)
{
$this->arrSql[] = $sql;
if( $result = sqlsrv_query($this->conn, $sql) ){
return $result;
}else{
if( ($errors = sqlsrv_errors() ) != null)
{
$msg = '';
foreach( $errors as $error)
{
$msg .= "message: ".$error[ 'message']."\n";
}
spError("{$sql}<br />执行错误: " . $msg);
}
}
}

/**
 * 返回影响行数
 */
public function affected_rows()
{
return sqlsrv_rows_affected($this->conn);
}

/**
 * 获取数据表结构
 *
 * @param tbl_name  表名称
 */
public function getTable($tbl_name)
{
$result = $this->getArray("SELECT syscolumns.name FROM syscolumns, systypes WHERE syscolumns.xusertype = systypes.xusertype AND syscolumns.id = object_id('{$tbl_name}')");
$columns = array();
foreach( $result as $column )$columns[] = array('Field'=>$column['name']);
return $columns;
}

/**
 * 构造函数
 *
 * @param dbConfig  数据库配置
 */
public function __construct($dbConfig)
{//print_r($dbConfig);exit();
if(!function_exists('sqlsrv_connect'))spError('PHP环境未安装sqlsrv函数库!');
$linkfunction = 'sqlsrv_connect';
$this->conn = $linkfunction(
$dbConfig['host'],
array(
'UID'=>$dbConfig['login'],
'PWD'=>$dbConfig['password'],
'Database'=>$dbConfig['database'],
)
) or spError("数据库链接错误 : " . print_r(sqlsrv_errors(), true)); 
}
/**
 * 对特殊字符进行过滤
 *
 * @param value  值
 */
public function __val_escape($value) {
if(is_null($value))return 'NULL';
if(is_bool($value))return $value ? 1 : 0;
if(is_int($value))return (int)$value;
if(is_float($value))return (float)$value;
if(@get_magic_quotes_gpc())$value = stripslashes($value);
$search=array("\\","\0","\n","\r","\x1a","'",'"');
        $replace=array("\\\\","[NULL]","\\n","\\r","\Z","''",'\"');
        return '\''.str_replace($search,$replace,$value).'\'';
}

/**
 * 析构函数
 */
public function __destruct()
{
@sqlsrv_close($this->conn);
}

/**
 * 转换MSSQL的LIMIT语句的转换函数
 */
function translimit($sql){       
if(preg_match('/ limit /i', $sql)){
//去连续空格 
while(preg_match("/  /", $sql))$sql = str_replace("  "," ",$sql);
$sql_array = explode(" ",$sql);
//取得部分重要的数组索引 
$i = 0;
while(isset($sql_array[$i]) && $sql_array[$i]){ 
if(strtolower($sql_array[$i])=="from")$from_id = $i;  
if(strtolower($sql_array[$i])=="limit")$limit_id = $i; 
if(strtolower($sql_array[$i])=="order")$order_id = $i;
$i++;

$last_id = $i-1; 
$two_num = explode(",",$sql_array[$limit_id+1]);
$totle_num = $two_num[0]+$two_num[1];

$sql_return = "SELECT ";
for($i=1;$i<=$from_id;$i++){ 
$sql_return .= $sql_array[$i]; 
$sql_return .= " "; 
}
$sql_return .= " ( SELECT TOP {$two_num[1]} ";
for($i=1;$i<=$from_id;$i++){
$sql_return .= $sql_array[$i]; 
$sql_return .= " "; 
}
$sql_return .=" ( SELECT TOP {$totle_num} ";
for($i=1;$i<$limit_id;$i++){
$sql_return .= $sql_array[$i] ; 
$sql_return .= " "; 

$sql_return .= " ) AS SPTMP_MSSQL_TOTLERESULT ";
if(preg_match("/ desc /i", $sql)){
for($i=$from_id+2;$i<$limit_id;$i++){
if(strtolower($sql_array[$i]) == "desc")continue;
$sql_return .= $sql_array[$i];
$sql_return .= " ";
}
}else{
for($i=$from_id+2;$i<$limit_id;$i++){
$sql_return .= $sql_array[$i];
$sql_return .= " ";
if($i == $order_id+2)$sql_return .= " DESC ";

}
$sql_return .= " ) AS SPTMP_MSSQL_ALLRESULT ";
for($i=$from_id+2;$i<$limit_id;$i++){$sql_return .= $sql_array[$i] ." ";}
return $sql_return;
}else{
return $sql;
}
}
}

#4


代码是$conn=new PDO("mssql:host=localhost;dbname=user_info","sa","jiushi");

#5


我确认用户名跟密码都没错,服务器名是localhost

#6


localhost 肯定是不行的,因为 localhost 不可能作为实例名

当只有一个实例时,服务名默认为 机器名
本地虚拟的实例名是 (local)

#7


看下扩展

#8


localhost 跟***\sqlexpress这两个服务器有什么不同?

#9


需要安装驱动....

http://www.microsoft.com/download/en/details.aspx?id=8059

#1


不知道你的服务器名是如何写的
多实例时应用实例名,单实例时应用实例名或机器名
另外,自 2005 起,默认是不予许远程访问的

#2


你把连接数据库的代码贴出来看一下

#3


php 5.3以后的版本是不能用mssql了,得去微软网站下载php扩展sqlsrv加载。

还付一chm手册。这个是speedphp fk自己新增的一个类,参考参考吧

<?php
/////////////////////////////////////////////////////////////////
// SpeedPHP中文PHP框架, Copyright (C) 2008 - 2010 SpeedPHP.com //
/////////////////////////////////////////////////////////////////

/**
 * db_mssql MsSQL数据库的驱动支持
 */
class db_sqlsrv {
/**
 * 数据库链接句柄
 */
public $conn;
/**
 * 执行的SQL语句记录
 */
public $arrSql;

/**
 * 按SQL语句获取记录结果,返回数组
 * 
 * @param sql  执行的SQL语句
 */
public function getArray($sql)
{
if( ! $result = $this->exec($sql) )return array();
//if( ! sqlsrv_num_rows($result) )return array();
$rows = array();
while($rows[] = sqlsrv_fetch_array($result,SQLSRV_FETCH_ASSOC)){}
sqlsrv_free_stmt($result);
array_pop($rows);
return $rows;
}

/**
 * 返回当前插入记录的主键ID
 */
public function newinsertid()
{
$result = $this->getArray("select @@IDENTITY as sptmp_newinsert_id");
return $result[0]['sptmp_newinsert_id'];
}

/**
 * 格式化带limit的SQL语句
 */
public function setlimit($sql, $limit)
{
if(!eregi(",", $limit))$limit = '0,'.$limit;
$sql .= " LIMIT {$limit}";
return $this->translimit($sql);
}

/**
 * 执行一个SQL语句
 * 
 * @param sql 需要执行的SQL语句
 */
public function exec($sql)
{
$this->arrSql[] = $sql;
if( $result = sqlsrv_query($this->conn, $sql) ){
return $result;
}else{
if( ($errors = sqlsrv_errors() ) != null)
{
$msg = '';
foreach( $errors as $error)
{
$msg .= "message: ".$error[ 'message']."\n";
}
spError("{$sql}<br />执行错误: " . $msg);
}
}
}

/**
 * 返回影响行数
 */
public function affected_rows()
{
return sqlsrv_rows_affected($this->conn);
}

/**
 * 获取数据表结构
 *
 * @param tbl_name  表名称
 */
public function getTable($tbl_name)
{
$result = $this->getArray("SELECT syscolumns.name FROM syscolumns, systypes WHERE syscolumns.xusertype = systypes.xusertype AND syscolumns.id = object_id('{$tbl_name}')");
$columns = array();
foreach( $result as $column )$columns[] = array('Field'=>$column['name']);
return $columns;
}

/**
 * 构造函数
 *
 * @param dbConfig  数据库配置
 */
public function __construct($dbConfig)
{//print_r($dbConfig);exit();
if(!function_exists('sqlsrv_connect'))spError('PHP环境未安装sqlsrv函数库!');
$linkfunction = 'sqlsrv_connect';
$this->conn = $linkfunction(
$dbConfig['host'],
array(
'UID'=>$dbConfig['login'],
'PWD'=>$dbConfig['password'],
'Database'=>$dbConfig['database'],
)
) or spError("数据库链接错误 : " . print_r(sqlsrv_errors(), true)); 
}
/**
 * 对特殊字符进行过滤
 *
 * @param value  值
 */
public function __val_escape($value) {
if(is_null($value))return 'NULL';
if(is_bool($value))return $value ? 1 : 0;
if(is_int($value))return (int)$value;
if(is_float($value))return (float)$value;
if(@get_magic_quotes_gpc())$value = stripslashes($value);
$search=array("\\","\0","\n","\r","\x1a","'",'"');
        $replace=array("\\\\","[NULL]","\\n","\\r","\Z","''",'\"');
        return '\''.str_replace($search,$replace,$value).'\'';
}

/**
 * 析构函数
 */
public function __destruct()
{
@sqlsrv_close($this->conn);
}

/**
 * 转换MSSQL的LIMIT语句的转换函数
 */
function translimit($sql){       
if(preg_match('/ limit /i', $sql)){
//去连续空格 
while(preg_match("/  /", $sql))$sql = str_replace("  "," ",$sql);
$sql_array = explode(" ",$sql);
//取得部分重要的数组索引 
$i = 0;
while(isset($sql_array[$i]) && $sql_array[$i]){ 
if(strtolower($sql_array[$i])=="from")$from_id = $i;  
if(strtolower($sql_array[$i])=="limit")$limit_id = $i; 
if(strtolower($sql_array[$i])=="order")$order_id = $i;
$i++;

$last_id = $i-1; 
$two_num = explode(",",$sql_array[$limit_id+1]);
$totle_num = $two_num[0]+$two_num[1];

$sql_return = "SELECT ";
for($i=1;$i<=$from_id;$i++){ 
$sql_return .= $sql_array[$i]; 
$sql_return .= " "; 
}
$sql_return .= " ( SELECT TOP {$two_num[1]} ";
for($i=1;$i<=$from_id;$i++){
$sql_return .= $sql_array[$i]; 
$sql_return .= " "; 
}
$sql_return .=" ( SELECT TOP {$totle_num} ";
for($i=1;$i<$limit_id;$i++){
$sql_return .= $sql_array[$i] ; 
$sql_return .= " "; 

$sql_return .= " ) AS SPTMP_MSSQL_TOTLERESULT ";
if(preg_match("/ desc /i", $sql)){
for($i=$from_id+2;$i<$limit_id;$i++){
if(strtolower($sql_array[$i]) == "desc")continue;
$sql_return .= $sql_array[$i];
$sql_return .= " ";
}
}else{
for($i=$from_id+2;$i<$limit_id;$i++){
$sql_return .= $sql_array[$i];
$sql_return .= " ";
if($i == $order_id+2)$sql_return .= " DESC ";

}
$sql_return .= " ) AS SPTMP_MSSQL_ALLRESULT ";
for($i=$from_id+2;$i<$limit_id;$i++){$sql_return .= $sql_array[$i] ." ";}
return $sql_return;
}else{
return $sql;
}
}
}

#4


代码是$conn=new PDO("mssql:host=localhost;dbname=user_info","sa","jiushi");

#5


我确认用户名跟密码都没错,服务器名是localhost

#6


localhost 肯定是不行的,因为 localhost 不可能作为实例名

当只有一个实例时,服务名默认为 机器名
本地虚拟的实例名是 (local)

#7


看下扩展

#8


localhost 跟***\sqlexpress这两个服务器有什么不同?

#9


需要安装驱动....

http://www.microsoft.com/download/en/details.aspx?id=8059