правильное использование Zend_Db - PullRequest
1 голос
/ 09 июня 2009

В настоящее время я использую класс 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 ]

3 голосов
/ 10 июня 2009

Много вопросов!

Управляет ли он открытием соединений? шикарно

Да, когда вы запускаете первый запрос, создается соединение, и последующие запросы используют то же соединение. Это верно, если вы повторно используете того же адаптера 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 должен быть в порядке, поэтому опубликуйте код, который не работает, так как, возможно, где-то есть ошибка.

0 голосов
/ 10 июня 2009

дополнение к ответу dcaunt: FetchAll возвращает массив ИЛИ Zend_Db_Talbe_Rowset - в зависимости от того, выполняете ли вы $zendDbTableModel->fetchAll() или $dbAdapter->fetchAll() То же самое касается fetchRow(). Если вы не можете заставить fetchRow работать на моделях, проще использовать $model->getAdapter()->fetchRow($sqlString);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...