2014-02-12 27 views
1

我正在开发一个需要从外部MSSQL数据库获取数据的应用程序。我花了很多时间尝试使用PHP获取各种连接MSSQL的方法,但有几条折旧的路线。如何在Windows开发环境中使用PHP中的MSSQL进行PDO?

在我运行Debian的生产环境,我能充分利用PDO_DLIB和freetds的东西是这样的连接:

$this->db = new \PDO('dblib:host='.$thedb_host_prod.';dbname='.$thedb_database_name_prod,  $thedb_database_user, $thedb_database_pass); 

在Windows,MSSQL折旧。我相信我使用Microsoft SQL Server驱动程序,并只能够得到它使用ODBC,它看起来像这样的工作:

$dsn = "Driver={SQL Server};Server=".$thedb_host_dev.";Database=".$thedb_database_name_dev; 
$this->odbc = odbc_connect($dsn, $thedb_database_user, $thedb_database_pass); 

然后,问题变成,在每一个方法,我需要做些什么对于ODBC来说,与我为DLIB做的不同。

public function exampleMethod(){ 

    // logic and create the query in $query 

    if($this->dev == false){ 
     // PRODUCTION 
     try { 
      $stmt = $this->db->prepare($query); 
      $stmt->execute(); 
      $result = $stmt->fetchAll(PDO::FETCH_OBJ); 
     } catch (PDOException $e) { 
      echo 'Connection failed: ' . $e->getMessage(); 
     } 
    } else { 
     // DEVELOPMENT 
     $query = $query; 
     $stmt = odbc_exec($this->odbc, ($query)); 
     $result = array(); 
     while($currentRow = odbc_fetch_object($stmt)){ 
      $jobNumber = $currentRow->Code; // Set object key to jobNumber 
      array_push($result, $currentRow); 
     } 
    } 
} 

这实际工作,但问题是,如何与需要准备VS的DBLIB查询应该如何准备ODBC查询,也就是说,如果我不想在每两次编写查询方法,我必须在每个动作之前创建它。这是非常糟糕的,因为这意味着我没有将我的变量放入带有PDO bindValue的查询中。

那么,有没有人能够在Windows环境下使用PHP 5.4和MSSQL获得PDO?有没有人看到一种保护查询的方式,它不会让我在每种方法中重复查询,一次用于ODBC,一次用于DBLIB?

我的计划目前是开发应用程序,然后删除所有的ODBC的东西,这将允许我正确地把查询放在$ stmt,避免这个问题。但在此之前,这让发展成为巨大的痛苦。

回答

1

我只是实际上不得不在php连接到MSSQL服务器做一些工作。由于php_pdo_sqlsrv.dll没有更新到5.5,我必须降级到php 5.4。对于dll文件,请检查here。但是现在到了我用来连接的代码,只要你有.dll文件在正确的位置。

try { 
    $db = new PDO("sqlsrv:Server={$host};Database={$database}", $userName, $password); 
}catch(PDOException $e){ 
    die("failed to connect"); 
} 

只是一个标准的PDO连接。只是为了得到它的工作,你必须确保.dll文件在php目录中。

我希望答案至少有部分问题。

+0

谢谢你的回答。我也认为我的问题与我的64位WAMP安装有关。我按照你的指示并重新安装了WAMP,这次是32位,并能够使php_pdo_sqlsrv_54_ts.dll扩展工作。对于有类似问题的任何其他人警告一句话,在WAMP和Apache文件夹的PHP文件夹中也有一个php.ini文件。我必须在两个php.ini文件中启用扩展。 – Dominick

1

我在Windows上使用PHP 5.4和SQL Server与PDO进行了合作。

我强烈建议使用微软的Web Platform Installer来设置一切。您可以使用它来安装PHP,开发的本地版本的SQL Server Express,official PHP driver for SQL Server和IIS,它们都可以一起使用。

请注意一点:SQL Server PDO驱动程序的最后一个版本是在2012年4月。我去年报告了一个错误,并被告知它在“有限支持”中,这显然意味着“你”靠你自己“。无论如何,它工作得很好。

0

Oooook,所以我终于搞定了!

这里是libraries/drivers for Sql-server connection via C/C++/java/PHP/etc.

准确地说,这里是Windows drivers for PHP


查看此页面了解which version you need to get


它们都存在于具有32和64,以及“线程安全”(TS)和“非线程安全”(NTS)版本。
从我读到的,如果您使用IIS工作,将使用nts版本。

用法:

  • 下载并解你所需要的包。
    在我的情况,包3.2,对于PHP 5.6
  • 采取必要的驱动程序
    在我的情况,php_sqlsrv_56_ts.dllphp_pdo_sqlsrv_56_ts.dll

  • 把它们放在你的php扩展目录
    在我的情况,[...] \ php5630vc11x86x170623162800 \ ext

    如果你想知道这个目录是在哪里鉴于你的PHP,它应该很容易找到,因为你有很多其他的DLL在这里。
    有可能的,php_pdo_mysql.dllphp_pdo_pgsql.dll

  • 修改你的php.ini
    小心WAMP,它似乎有一个在php目录另外一个在Apache目录。

    添加行以加载两个扩展。
    您可以将它们添加到文件末尾,或与其他扩展程序一起加载。
    就我而言,这里是我加:

    ;SQL-srever extensions 
    extension=php_sqlsrv_56_ts.dll 
    extension=php_pdo_sqlsrv_56_ts.dll 
    



这部分是为PHP/PDO的一面。
对于驱动程序来实际工作,您还需要您的(Windows)计算机安装ODBC驱动程序。

随意已经尝试连接,但如果它抱怨道,你所需要的ODBC驱动程序,请在这里获得:
Microsoft® ODBC Driver 11 for SQL Server®


最后,但并非最不重要的,可以肯定的为您的PDO连接使用正确的格式。
$conn = new PDO ("sqlsrv:Server=$srv_host;database=$srv_dbname";
为了便于比较,这里是我WSA使用我的Linux服务器上的内容:
$conn = new PDO ("dblib:host=$srv_host:$srv_port;dbname=$srv_dbname", "$srv_username", "$srv_password");

我认为这句法是共同所有的PDO的驱动程序,但现在看来我错了。
这是PHP PDO driver documentation

相关问题