如何在Windows开发环境中使用PHP中的MSSQL进行PDO?

我正在开发一个需要从外部MSSQL数据库获取数据的应用程序。 我花了很多时间试图用PHP获得各种连接到MSSQL的方法,但是有几条线路被贬值。

在运行Debian的生产环境中,我可以通过如下方式与PDO_DLIB和FreeTDSbuild立连接:

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

这实际上工作,但问题是,如何查询ODBC需要准备与如何准备DBLIB查询,意味着如果我不想在每个方法中写两次查询,我必须创build它在每个动作之前。 这是非常糟糕的,因为这意味着我不把我的variables放入与PDO的bindValue查询。

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

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

我只是实际上不得不在php连接到MSSQL服务器做一些工作。 我不得不降级到PHP 5.4,因为php_pdo_sqlsrv.dll没有更新为5.5。 对于dll文件在这里检查。 但现在到了我用来连接的代码,一旦你有.dll文件在正确的地方。

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

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

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

我在Windows上使用PHP 5.4和SQL server与PDO。

我强烈建议使用微软的Web平台安装程序来设置一切。 您可以使用它来安装PHP,本地版本的SQL server Express进行开发,SQL server的官方PHP驱动程序和IIS都设置为一起工作。

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

哦,所以我终于搞定了!

这里是通过C / C ++ / java / PHP /等Sql服务器连接的库/驱动程序。

确切地说,这里是PHP的Windows驱动程序 。

看看这个页面,知道你需要得到哪个版本

它们都存在32和64,以及“线程安全”(ts)和“非线程安全”(nts)版本。
从我读的,nts版本将被使用,如果你使用IIS。

用法:

  • 下载并解压你需要的软件包。
    在我的情况下,包3.2,为PHP 5.6
  • 采取必要的司机
    在我的情况下, php_sqlsrv_56_ts.dllphp_pdo_sqlsrv_56_ts.dll

  • 把它们放在你的php扩展目录中
    在我的情况下,[…] \ php5630vc11x86x170623162800 \分机

    如果你想知道这个目录在你的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驱动程序,去这里得到它:
用于SQLserver®的Microsoft®ODBC驱动程序11


最后但并非最不重要的一点是,确保为您的PDO连接使用正确的格式。
$conn = new PDO ("sqlsrv:server=$srv_host;database=$srv_dbname";
为了比较,这是我在我的Linux服务器上使用的:
$conn = new PDO ("dblib:host=$srv_host:$srv_port;dbname=$srv_dbname", "$srv_username", "$srv_password");

我认为这个语法对于所有的PDO驱动程序是通用的,但是看起来我错了。
这是PHP PDO驱动程序文档 。