1

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

文档中我可以看出,官方只支持 Sqlsrv 驱动程序,该驱动程序仅适用于 Windows 平台。

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

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

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

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

4

3 回答 3

3

安装 php5-sybase。确保freetds已安装。你应该有一个/etc/freetds名为的 conf 文件freetds.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',
        ),
    ),
);

看看这是否能帮助您并让我知道。我有一段时间让这个工作,我很乐意帮助其他有这个问题的人!!!

于 2013-03-24T03:28:04.760 回答
1

是的,您可以使用 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,并将其更改为使用[and]而不是".

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

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

于 2013-08-22T11:04:08.653 回答
1

您可以使用 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',
        )
);
于 2013-03-12T09:43:19.180 回答