为什么在执行sql脚本之前我的getConnection()时zend_db不起作用

时间:2012-06-27 07:05:43

标签: php zend-db

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的新手,我想结交一些朋友一起学习。提前谢谢。

1 个答案:

答案 0 :(得分:2)

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

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

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

例如,检查这段代码:

<?php
class A {}

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

这将抛出:

  

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

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

您应该按照通常的方式继续申请:

$sql = 'select * from department';
$resource = $dbAdapter->getConnection();
$results = $dbAdapter->fetchAll($sql);
顺便问一下,问题很好。