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

解决方案 »

  1.   

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

  2.   

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

  3.   

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

  4.   

    localhost 肯定是不行的,因为 localhost 不可能作为实例名当只有一个实例时,服务名默认为 机器名
    本地虚拟的实例名是 (local)
      

  5.   

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

  6.   

    需要安装驱动....http://www.microsoft.com/download/en/details.aspx?id=8059