Mik*_*ike 0 php sql sql-server pdo sqlsrv
我正在尝试使用PDO连接到SQL Server数据库.我一直在努力解决它现在我在我的页面上遇到这个致命错误,我试图连接到SQL Server
致命错误:带有消息'SQLSTATE [IMSSP]的未捕获异常'PDOException':此扩展需要Microsoft SQL Server 2012 Native Client ODBC驱动程序与SQL Server通信.访问以下URL以下载适用于x86的Microsoft SQL Server 2012 Native Client ODBC驱动程序:http://go.microsoft.com/fwlink/?LinkId = 163712 '
我从http://www.microsoft.com/en-us/download/details.aspx?id=20098(SQLSRV30.EXE)下载了驱动器 我已将这些驱动程序放在服务器上安装了php的ext目录中2008 R2服务器.
我还在php.ini文件的扩展名列的末尾添加了这两行
extension=php_pdo_sqlsrv_53_nts.dll
extension=php_sqlsrv_53_nts.dll
我正在使用PH PVersion 5.3.19服务器API CGI/FastCGI线程安全禁用
我确实看到,pdo_sqlsrv但我没有看到客户端API版本.
为了能够使用PDO连接到具有SQL数据库的远程服务器,我还需要做些什么?我是否需要在远程服务器上安装任何东西?
这是我的php我的管理部分的截图

这是我的连接类
<?php
class connection {
    private $connString;
    private $userName;
    private $passCode;
    private $server;
    private $pdo;
    private $errorMessage;
    protected $lastQueryTime;
    protected $lastQuery;
    private $pdo_opt = array (
                            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                            PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
                            );
    function __construct($dbName = DATABASE_NAME, $serverName = DATABASE_HOST){
        //sets credentials
        $this->setConnectionCredentials($dbName, $serverName);
        //start the connect
        $this->startConnection();
    }
    function startConnection(){
            $this->pdo = new PDO($this->connString, $this->userName, $this->passCode, $this->pdo_opt);
            if( ! $this->pdo){
                $this->errorMessage  = 'Failed to connect to database. Please try to refresh this page in 1 minute. ';
                $this->errorMessage .= 'However, if you continue to see this message please contact your system administrator.';
                echo $this->getError();
            }
    }
    //this will close the PDO connection
    public function endConnection(){
        $this->pdo = null;
    }
    //return a dataset with the results
    public function getDataSet($query, $data = NULL)
    {
        $start = microtime(true);
        $cmd = $this->pdo->prepare( $query );
        $cmd->execute($data);
        $ret = $cmd->fetchAll();
        //$cmd->closeCursor();
        $this->lastQueryTime = microtime(true) - $start;
        $this->lastQuery = $query;
        return $ret;
    }
    public function processQuery($query, $data = NULL)
    {
        $start = microtime(true);
               //$this->pdo->beginTransaction();
        $cmd = $this->pdo->prepare( $query );
        $ret = $cmd->execute($data);
               //$this->pdo->commit();
               //$cmd->closeCursor();
        $this->lastQueryTime = microtime(true) - $start;
        $this->lastQuery = $query;
        return $ret;
    }
    //return last insert id
    public function lastInsertId($name = NULL) {
        if(!$this->pdo) {
            return false;
        }
        return $this->pdo->lastInsertId($name);
    }
    public function getOneResult($query, $data = NULL){
        $cmd = $this->pdo->prepare( $query );
        $cmd->execute($data);
        return $cmd->fetchColumn();
    }
    public function getError(){
        if($this->errorMessage != '')
            return $this->errorMessage;
        else
            return true;  //no errors found
    }
    //this where you need to set new server credentials with a new case statment
    function setConnectionCredentials($dbName, $serv){
        switch($serv){
            //MS SQL server
            case 'SQLSERVER':
                $this->connString   = 'sqlsrv:server='.$serv.';database='.$dbName;
                $this->userName     = 'username';  
                $this->passCode     = 'password';  
            break;
            //the defaults are predefined in the APP_configuration file - DO NOT CHANGE THE DEFAULT
            default:
                $this->connString   = 'mysql:host='.DATABASE_HOST.';dbname='.DATABASE_NAME.';charset=utf8';
                $this->userName     = DATABASE_USERNAME;
                $this->passCode     = DATABASE_PASSWORD;
            break;
            }
    }
public function lastQueryTime() {
    if(!$this->lastQueryTime) {
        throw new Exception('no query has been executed yet');
    }
    return $this->lastQueryTime;
}
public function lastQuery() {
    if(!$this->lastQuery) {
        throw new Exception('no query has been executed yet');
    }
    return $this->lastQuery;
}
}
?>
这就是我使用我的类来拉取数据集的方法
<?php
include('connection.php');
$sql_db = new connection('databaseName','SQLSERVER');
$call_details = $sql_db->getDataSet('SELECT
                                    LocalUserId AS loginName,
                                    RemoteNumberCallId AS PhoneNumber,
                                    SUM(CallDurationSeconds + HoldDurationSeconds + LineDurationSeconds) AS totalTalk
                                    FROM dbo.CallDetail WHERE LocalUserId = \'blah\' AND RemoteNumberCallId = \'123456789\'
                                    GROUP BY LocalUserId, RemoteNumberCallId');
$call_details->endConnection();
?>
我甚至尝试过这段代码,所以我不会使用我的课程,但仍然会遇到同样的错误
 $ss = new PDO("sqlsrv:server=SQLSERVER; Database=databaseName", "userName", "Password");
我已经取代了
extension=php_sqlsrv_53_nts.dll extension=php_pdo_sqlsrv_53_nts.dll
同
extension=php_pdo_sqlsrv_53_nts_vc9.dll extension=php_sqlsrv_53_nts_vc9.dll
在使用SQLSRV30.EXE时,我使用了SQLSRV20.EXE.
@FreshPrinceOfSo感谢您的帮助:)
谢谢 :)