正确使用Zend_Db

时间:2009-06-09 17:51:41

标签: zend-framework pdo

我目前正在使用Zend_Db类来管理我的数据库连接。 我有几个问题。

  • 它是否巧妙地管理开放连接? (例如,我已经打开一个连接,是否知道要使用它 - 或者我必须经常检查是否已经打开一个连接之前已经打开了连接?)
  • 我使用以下代码获取结果(以FETCH_OBJ模式获取):

     $final = $result->fetchAll();

    return $final[0]->first_name;

由于某种原因,fetchRow不起作用 - 所以我经常使用fetchAll,即使我只有一个结果(比如搜索WHERE id= number而id是PK)

我的问题是 - 当我使用fetchAll而不是fetchRow时,我会牺牲多少时间/内存,即使只有结果?

  • 我创建了以下类来管理我的连接:

    require 'Zend/Db.php';

  class dbconnect extends Zend_Db 

 {



 function init ()
    {
         $params = array (......

        return Zend_Db::factory ( 'PDO_MYSQL', $params );   
    }

 }

然后我打电话


$handle = dbconnect::init

$handle->select()....

这是最好的方法吗?有没有人有更好的主意?

谢谢!

P.S。对不起,这里的代码格式很糟糕..

2 个答案:

答案 0 :(得分:3)

很多问题!

  

是否管理开放连接   巧妙?

是的,当您运行第一个查询时,会创建一个连接,后续查询将使用相同的连接。如果您重用相同的Zend_Db适配器,则会出现这种情况。我通常使用Zend_Registry将它提供给我的整个应用程序:

$db = Zend_Db::factory(...) // create Db instance
Zend_Registry::set('db', $db);

//in another class or file somewhere
$db = Zend_Registry::get('db');
$db->query(...)//run a query

以上代码通常在您的应用程序 bootstrap 中。我不打算将Zend_Db类扩展为初始化和实例化。

关于fetchRow - 我认为关键的区别在于查询运行限制为1行,并且返回的对象是Zend_Db_Table_Row而不是Zend_Db_Table_Rowset(就像行数组一样),并且执行速度不会明显变慢。

fetchRow应该没问题,所以发布一些不起作用的代码,因为某处可能存在错误。

答案 1 :(得分:0)

除了dcaunt的回答: FetchAll返回数组OR Zend_Db_Talbe_Rowset - 取决于您执行$zendDbTableModel->fetchAll()还是$dbAdapter->fetchAll() 同样适用于fetchRow()。如果您未能使fetchRow适用于模型,则使用$model->getAdapter()->fetchRow($sqlString);

会更容易