2013-04-25 2 views
1

Я пытаюсь использовать PDO для подключения к базе данных SQL Server. Я боролся с ним немного теперь я получаю эту ошибку Fatal на моей странице, где я пытаюсь подключиться к SQL ServerКак установить pdo_sqlsrv на мои окна 2008 Server 2008 R2?

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) I разместили эти драйверы в каталоге ext, где php установлен на сервере Server 2008 R2.

Я также добавил эти 2 строки в конце списка расширений в файле php.ini

extension=php_pdo_sqlsrv_53_nts.dll 
extension=php_sqlsrv_53_nts.dll 

Я использую PH PVersion 5.3.19 сервера API CGI/FastCGI безопасности Thread отключена

Я вижу 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

+0

что для вашего комментария. Что такое sqlsrv_query? и как я могу это использовать? – Mike

+0

** sqlsrv_query ** является частью серии ** sqlsrv _ ** функций PHP, которые являются альтернативой PDO. Это не поможет вам, так как ваша проблема находится вне PHP, на уровне драйвера/ОС. –

ответ

1

Моя личная установка для Windows Server 2008 R2 и настройка с использованием PHP/SQL Server.

  1. Загрузить последнюю конюшню.почтовый выпуск VC9 x86 Non Thread Safe из PHP Downloads
  2. Extract в РНР каталог
  3. Скачать Microsoft Drivers 3.0 for PHP for SQL Server
  4. Extract в каталог 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

+3

Могу ли я VTC оставить комментарий в виде дубликата? – Zane

+1

на всякий случай, если вы не получили его в первый раз, @FreshPrinceOfSO – swasheck

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 Standard Edition (64-разрядная версия), IIS 6 и PHP 5.3 с php_pdo_sqlsrv_53_ts_vc9.dll и php_sqlsrv_53_ts_vc9.dll Включено. – Colin

Смежные вопросы