如何在 Windows 开发环境中在 PHP 中使用 PDO 和 MSSQL?

Posted

技术标签:

【中文标题】如何在 Windows 开发环境中在 PHP 中使用 PDO 和 MSSQL?【英文标题】:How can I use PDO with MSSQL in PHP from a Windows dev envirenment? 【发布时间】:2014-02-12 02:46:10 【问题描述】:

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

在我运行 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);
        
    

这确实有效,但问题是,需要如何准备 ODBC 查询与应如何准备 DBLIB 查询,这意味着如果我不想在每种方法中编写两次查询,我有在每个动作之前创建它。这真的很糟糕,因为这意味着我没有使用 PDO 的 bindValue 将变量放入查询中。

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

我目前的计划是开发应用程序,然后删除所有 ODBC 内容,这将使我能够正确地将查询放入 $stmt 中,避免这个问题。但在那之前,它让开发成为一个巨大的痛苦。

【问题讨论】:

【参考方案1】:

我实际上只需要在连接到 MSSQL 服务器的 php 中做一些工作。由于 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 目录中。

我希望这至少能回答部分问题。

【讨论】:

感谢您的回答。我还认为我的问题与我的 64 位 WAMP 安装有关。我按照您的说明再次安装了 WAMP,这次是 32 位的,并且能够使 php_pdo_sqlsrv_54_ts.dll 扩展工作正常。警告任何有类似问题的人,在 WAMP 的 PHP 文件夹和 Apache 文件夹中都有一个 php.ini。我必须在两个 php.ini 文件中启用扩展。【参考方案2】:

我曾在 Windows 上使用 PHP 5.4 和带有 PDO 的 SQL Server。

我强烈建议使用 Microsoft 的 Web Platform Installer 进行设置。您可以使用它来安装 PHP、用于开发的本地版本的 SQL Server Express、official PHP driver for SQL Server 和 IIS,所有这些都设置为协同工作。

注意一点:SQL Server PDO 驱动程序的最后一个版本是在 2012 年 4 月。我去年报告了一个针对它的错误,并被告知它处于“有限支持”状态,显然翻译为“你是靠自己”。无论如何,它运行得相当好。

【讨论】:

【参考方案3】:

Oooook,所以我终于让它工作了!

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

没错,这里是Windows drivers for PHP。

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

它们都存在于 32 和 x64 以及“线程安全”(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 目录中有一个 AND 在 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"; 为了比较,这是我在我的 linux 服务器上使用的内容: $conn = new PDO ("dblib:host=$srv_host:$srv_port;dbname=$srv_dbname", "$srv_username", "$srv_password");

我认为这种语法对所有 PDO 驱动程序都是通用的,但看来我错了。 这里是PHP PDO driver documentation。

【讨论】:

以上是关于如何在 Windows 开发环境中在 PHP 中使用 PDO 和 MSSQL?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Windows下配置搭建PHP环境

qt creator中在调试状态下如何查看变量的值

php环境如何配置

如何在windows中使cygwin构建程序使用windows路径

怎么在window下搭建Lnmp php开发坏境?

如何在windows下搭建Nginx+MySQL+PHP环境