1
try
 {
    $dbAdapter = Zend_Db::factory($config->general->db->adapter, $config->general->db-        >config->toArray());

    // first 
    $sql = 'select * from department';
    $results = $dbAdapter->fetchAll($sql);

    // second 
    $db = $dbAdapter->getConnection();
    $sql = 'select * from department';
    $results = $db->fetchAll($sql);
}
catch (Zend_Db_Adapter_Exception $exc)
{
     echo $exc->getTraceAsString();
}
catch (Zend_Exception $exc)
{
   echo $exc->getTraceAsString();
}

当我使用第一种方式时,应用程序运行良好,但是当我使用第二种方式 - 获取连接然后运行 ​​sql 脚本时,它不起作用,更糟糕的是应用程序被阻止在线($db-> fetchAll($sql)) 并且不返回任何错误。是什么原因?有人遇到过这个问题吗?顺便说一句,我是一个学习PHP的大一新生,我想结交一些朋友一起学习它。提前致谢。

4

1 回答 1

2

Zend_Db 本质上是许多 RDBMS PHP 模块的包装器,为 Zend 框架提供单一的数据库抽象接口。这意味着您最终将使用 Zend_Db 以几乎相同的方式编写 SQL 请求,即使您使用的是 MySQL、MSSQL、PostgreSQL 等。

getConnection()方法将强制数据库连接,并将返回数据库层的实际底层资源/对象。即如果你使用mysqli getConnection() 将返回一个mysqli 类型的对象。(http://www.php.net/manual/en/class.mysqli.php)

然后将 mysqli 实例类分配给$db变量,并尝试调用一个fetchAll()fetchAll()在 mysqli 类中不存在的类。此时它可能会抛出一个错误,如果您没有错误报告,则会导致空白页。

例如检查这段代码:

<?php
class A {}

$a = new A();
$a->doesNotExist();

这将抛出:

PHP 致命错误:在第 5 行的 foobar.php 中调用未定义的方法 A::doesNotExist()

因此,您可以调用getConnection()来强制数据库层连接到 RDBMS,但据我所知,不需要getConnection(). 您可以在 Zend_Db 文档的“管理惰性连接”部分阅读有关 getConnection() 以及为什么有人需要该资源的更多信息 - http://framework.zend.com/manual/en/zend.db.adapter .html

您应该像往常一样继续您的申请:

$sql = 'select * from department';
$resource = $dbAdapter->getConnection();
$results = $dbAdapter->fetchAll($sql);

顺便说一句,问得很好。

于 2012-06-27T07:29:33.593 回答