php - 如何在 Windows 开发环境的 PHP 中将 PDO 与 MSSQL 结合使用?

标签 php sql sql-server windows pdo

我正在开发一个需要从外部 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 查询,这意味着如果我不想在每个方法中写两次查询,我有在每个 Action 之前创建它。这真的很糟糕,因为这意味着我没有将我的变量放入具有 PDO 的 bindValue 的查询中。

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

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

最佳答案

太棒了,我终于让它工作了!

这是 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 .

关于php - 如何在 Windows 开发环境的 PHP 中将 PDO 与 MSSQL 结合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21717562/

相关文章:

php - 使用SQL从mysql表中选择数据

PHP/MySQL 插入表单

php - php中的模板字符串解析

sql - Oracle Sql Dev 中 COMPILE 和 COMPILE WITH DEBUG 之间的区别?

mysql - 具有多个 where 条件的 SQL 多重选择

sql-server - 如何同时对具有 2 个值的列进行分组和计数?

sql - 重命名表列并将其传播到依赖 View

PHP - in_array、循环和 if 语句

sql - 如何将字段的总和聚合为字符串_聚合值Postgres

c# - 1 级 C#/SQL Server 开发人员测试