2013-04-25 190 views
1

我正在尝试使用PDO连接到SQL Server数据库。我一直在用它挣扎了一点点现在我得到我的网页上这个严重的错误,我试图连接到SQL Server如何在我的Windows 2008 Server 2008 R2上安装pdo_sqlsrv?

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[IMSSP]: This extension requires the Microsoft SQL Server 2012 Native Client ODBC Driver to communicate with SQL Server. Access the following URL to download the Microsoft SQL Server 2012 Native Client ODBC driver for x86: http://go.microsoft.com/fwlink/?LinkId=163712 '

我从 http://www.microsoft.com/en-us/download/details.aspx?id=20098(SQLSRV30.EXE) 我下载了驱动器已将这些驱动程序放置在Server 2008 R2服务器上安装php的ext目录中。

我也有在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我管理部分

enter image description here

的截图这是我的连接类

<?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"); 
+0

没有。它应该很好去..尝试使用'sqlsrv_query'。 – Kermit 2013-04-25 20:10:03

+0

您的评论。什么是sqlsrv_query?我该如何使用它? – Mike 2013-04-25 20:12:35

+0

** sqlsrv_query **是可替代PDO的** sqlsrv _ **系列PHP函数的一部分。这将*不会*帮助你,因为你的问题在PHP之外,在驱动程序/操作系统级别。 – 2015-06-16 01:16:55

回答

1

我个人安装的Windows Server 2008 R2和PHP/SQL Server的配置。

  1. 下载最新的马厩。VC9 x86的非线程安全的PHP Downloads
  2. 提取的压缩释放到你的PHP目录
  3. 下载Microsoft Drivers 3.0 for PHP for SQL Server
  4. 解压到你的PHP目录\ext
  5. 编写如下扩展php.ini

    [PHP_SQLSRV_54_NTS]

    extension=php_sqlsrv_54_nts.dll

    [PHP_PDO_SQLSRV_54_NTS]

    extension=php_pdo_sqlsrv_54_nts.dll

+0

我的确如此。 但因为我已经安装了php5.3.19我去你在步骤3中添加此 到我的php.ini文件 [PHP_SQLSRV_54_NTS] 延长= php_sqlsrv_54_nts.dll [PHP_PDO_SQLSRV_54_NTS]延长= php_pdo_sqlsrv_54_nts.dll。 这不起作用。我不确定是什么问题。 我是否需要在此服务器上安装SQL?请注意,MS SQL未安装在此服务器上(我在哪里运行我的php脚本) 但它安装在远程保留位置,我试图连接到SQL服务 – Mike 2013-04-25 21:00:49

+3

我可以VTC作为重复的评论吗? – Zane 2013-04-25 21:02:54

+1

以防万一你第一次没有得到它,@FreshPrinceOfSO – swasheck 2013-04-25 21:03:26

5

我已经更换了

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

insted的使用SQLSRV30.EXE我用SQLSRV20.EXE这个工作。

@FreshPrinceOfSo感谢您的帮助:)

谢谢:)

+1

在Win 2008 R2 x64,SQL Server标准版(64位),IIS 6和PHP 5.3以及php_pdo_sqlsrv_53_ts_vc9.dll&php_sqlsrv_53_ts_vc9.dll启用后,我对这件事大为恼火。 – Colin 2014-10-22 14:01:21

相关问题