【问题标题】:How to use Zend Framework 2 with MS SQL Server on *nix?如何在 *nix 上使用 Zend Framework 2 和 MS SQL Server?
【发布时间】:2013-03-11 18:27:17
【问题描述】:

如果存在的话,在非 Windows 操作系统上将 ZF2 与 MS SQL Server 一起使用的规范方法是什么?

从documentation得知,官方只支持Sqlsrv驱动,只支持Windows平台。

在 ZF1 中,我们使用了Pdo_Mssql 适配器并将pdoType 指定为dblib。我找不到任何关于在 ZF2 中做类似事情的参考资料。

显然有前一段时间有一个 Pdo\Mssql 驱动程序在 refactoring 主要期间被删除,但我没有看到当前记录的使用 Pdo_Dblib 的方式。

根据上面的适配器文档,您可以将适配器配置中的驱动程序设置为Pdo=OtherPdoDriver,但没有记录此用法的示例。这是否意味着您可以使用Pdo=Pdo_Dblib 或Pdo=dblib 并且它会自动工作?

我发现传递对 PDO ODBC 驱动程序的引用,这将是一个可用的替代方案,但找不到任何文档或代码引用。

【问题讨论】:

  • 有Zend\Db\Adapter\Driver\Sqlsrv,sqlsrv 是一个 php 扩展(由 microsoft 提供),我没有任何要测试的东西,但将两者结合起来应该可以提供解决方案。 php sqlsrv 手册页 -> php.net/manual/en/book.sqlsrv.php github zf2 驱动代码 -> github.com/zendframework/zf2/blob/master/library/Zend/Db/…
  • Crisp,正如我在问题中指出的那样,正如 nofreeusername 在他提供的答案中指出的那样,Sqlsrv 仅适用于 Windows 平台。仅供参考,如果您建议答案,请这样做而不是发表评论。这样如果可行,我可以接受你的回答。
  • 感谢您消除了我对 sqlsrv php 扩展的明显误解,我误以为它是看似已失效的 mssql 的替代品,但没有意识到它与平台有关:- / 至于不作为答案发布,除非我有理由确定它有效,否则我不会提供答案,但不幸的是,正如我所说,我无法测试,这就是为什么我选择只留下评论暗示可能(或不)解决方案。

标签: sql-server zend-framework2 zend-db


【解决方案1】:

安装 php5-sybase。确保已安装 freetds。您应该在/etc/freetds 下有一个名为freetds.conf 的conf 文件。

在您的 freetds.conf 文件中,您应该像这样设置您的 mssql 连接:

[MyMsSqlServer]
host = symachine.domain.com
port = 5000
tds version = 5.0

然后,(此处以 ZF2 相册教程为例)您可以这样设置适配器:

return array(
    'db' => array(
        'driver'         => 'Pdo',
        'dsn'            => 'dblib:host=MyMsSqlServer;dbname=zf2tutorial',
        'charset'        =>  'UTF-8',
        'username'       => 'username',
        'password'       => 'password',
        'pdotype'       => 'dblib',
    ),
    'service_manager' => array(
        'factories' => array(
            'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory',
        ),
    ),
);

看看这是否能帮到你,然后告诉我。我花了一些时间让这个工作,我很乐意帮助其他有这个问题的人!!!

【讨论】:

    【解决方案2】:

    您可以使用 pdo 连接并将 pdotype 设置为 dblib(加载 pdo_dblib 扩展名)。 sqlsrv 仅适用于 Windows。

    在这里您可以看到如何配置 freetds 和 unixodbc 以连接到 MS SQL Server。 http://featurebug.blogspot.de/2011/01/mac-os-x-php-zend-server-ce-freetds-and.html

    更新: 下面是一个如何使用连接字符串进行连接的示例:

    $db = new Zend\Db\Adapter\Adapter(
        array(
            'driver'        => 'Pdo',
            'dsn'            => 'dblib:host=mssql_freetds;',
            'username'       => 'mssql_username',
            'password'       => 'mssql_password',
            )
    );
    

    【讨论】:

    • 感谢您的尝试回答,但您真的阅读了我的问题吗?我特别承认 Sqlsrv“仅适用于 Windows 平台”。此外,我提到在 ZF1 中成功使用 Pdo_Mssql 和 dblib 的 pdoType。您没有提供与使用 ZF2 相关的任何新内容。
    • 如果您指的是 Crisp 的评论(应该是一个答案),它应该是在后续评论中,而不是对我原来问题的建议答案。
    • 是的,请阅读您的问题。使用 ZF2 Db 适配器,您可以使用任何 PDO 驱动程序,因此您应该使用 PDO 连接。要连接到 MS SQL 服务器,您需要 pro_dblib 驱动程序,并且您必须将 pdoType 设置为 dblib,此外,您还需要服务器端的 freetds 和 unixodbc。还有一个 ZF2 模块。请看一下,但我还没有测试过这个模块:github.com/mabuzagu/PDODblibModule
    【解决方案3】:

    是的,您可以使用 odbc 进行连接。它目前不受官方支持,但您可以相当轻松地使用它,只需进行少量修改。

    您需要做的第一件事是确保您可以使用基本的 PHP PDO 函数进行连接。所以,做这样的事情:

    $resource = new PDO('odbc:driver=FreeTDS;dbname=MYDB;Server=127.0.0.1;Port=8090;UID=Testuser;PWD=testpass;', 'Testuser', 'testpass', array());
    $s = $resource->prepare('SELECT * FROM TEST_TABLE');
    $r=$s->execute();
    var_dump($r);
    

    您需要更改您的设置的主机、端口、用户、密码、表名等,但您可以使用它来确保您拥有正确的这些详细信息。一旦你知道你在做什么来连接,你就可以使用 Zend 访问它,如下所示:

    $configArray = array(
        'driver' => 'pdo_odbc',
        'driver_options' => array('driver' => 'FreeTDS'),
        'platform' => 'Mssql',
        'dbname' => 'MYDB',
        'host' => '127.0.0.1',
        'port' => 8090,
        'user' => 'Testuser',
        'pass' => 'testpass'
    );
    
    $adapter = new Zend\Db\Adapter\Adapter($configArray);
    
    $q = new Zend\Db\Sql\Select();
    $q->from('TEST_TABLE');
    $sql = $q->getSqlString($adapter->platform);
    $r = $adapter->query($sql);
    echo $r->getSql()."\n";
    $result = $r->execute();
    while(($res = $result->next()) !== false){
        print_r($res);
    }
    

    但是这实际上行不通,原因有二。一、平台——Zend目前没有mssql平台;它默认为 sql92,不起作用,因为它在 "" 中引用标识符,而当 mssql 需要用 [] 引用它们时。因此,您需要将 Zend/Db/Adapter/Platform/Sql92.php 复制为 Mssql.php,并将其更改为使用 [ 和 ] 而不是 "。

    其次,因为连接 odbc 的 dsn 需要 driver 字段,zend 目前不支持。您需要打开 Driver/Pdo/Connection 类并修改连接函数,添加 $dsn[] = "driver={$options['driver']}"; 并在 $pdoDriver = odbc 时将 $dsn[] = "host={$hostname}"; 替换为 $dsn[] = "server={$hostname}";。

    请注意,其他答案是由实际上不了解 Zend 2 库如何工作的人发布的 - 如果您为 'dsn' 指定值,则其他字段将被忽略。我不知道他们从哪里得到“pdotype”的想法,因为这不是出现在代码中任何地方的字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多