是的,您可以使用 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”的想法,因为这不是出现在代码中任何地方的字段。