Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Zend_Db_Select


Автор: Gulnaza 9.4.2008, 13:09
Использую ZendFramework.
не выполняется элементарный запрос
в контроллере:
Код

----
$select = new Zend_Db_Select();
$select->from('obj_titul', array('ob_id','ob_deal','ob_dopinfa','ob_adress'));
$result =$select->query();
$obj = $result->fetchAll();

-----

в temlates:
Код

{foreach from=$obj item=obj} 
<tr>
    <td><input type="checkbox" name="checks[]" value="{$obj->ob_id}"></td>
    <td>{$obj->ob_id}</td>
    <td>{$obj->ob_deal}</td>
        <td>{$obj->ob_dopinfa}</td>
    <td>{$obj->ob_adress}</td>

</tr>
{/foreach}



вообще ничего не выводит. либо выводит ошибку - 
Fatal error: Call to a member function select() on a non-object 
Подскажите пожалуйста в чем может быть проблема

Автор: Feldmarschall 9.4.2008, 13:17
Gulnaza, надо спрашивать не "в чем может быть проблема", а "как я могу узнать сам - в чем проблема".
И указывать строку, в которой произошла эта ошибка.

Как в документации написано использовать Zend_Db_Select()?

Автор: Gulnaza 9.4.2008, 13:24
все сделано по документации
строка на которую указывает ошибка - #1 при таком варианте: 
Код

$select = $db->select()
        ->from(array('ob' => 'obj_titul'));
$result =$select->query();
        $obj = $result->fetchAll();

Автор: Fortop 9.4.2008, 13:52
На самом деле ошибка во второй строке

Посмотри, как должен инициализироваться Zend_DB_Select
ты установил Zend_DB_Adapter? 

Код

 Zend_Db_Select  __construct  (Zend_Db_Adapter_Abstract $adapter)

http://framework.zend.com/manual/ru/zend.db.select.html
http://framework.zend.com/apidoc/core/Zend_Db/Select/Zend_Db_Select.html

Автор: mishaSL 9.4.2008, 13:53
Gulnaza, у вас вообще есть подключение к БД?

Попробуйте так:
Код


<?php
require_once 'Zend/Db.php';

// Автоматически загружает класс Zend_Db_Adapter_Pdo_Mysql
// и создает его экземпляр.
$db = Zend_Db::factory('Pdo_Mysql', array(
    'host'     => '127.0.0.1',
    'username' => 'webuser',
    'password' => 'xxxxxxxx',
    'dbname'   => 'test'
));
$select = $db->select();
// ну и дальше, то что у вас...
$select->from('obj_titul', array('ob_id','ob_deal','ob_dopinfa','ob_adress'));
$result =$select->query();
$obj = $result->fetchAll();

Автор: Gulnaza 9.4.2008, 14:19
mishaSL, подключение к бд конечно же есть в index.php
вот как раз с таким вариантом  - $select = $db->select(); - выползает ошибка на Select()

Добавлено через 10 минут и 56 секунд
Fortop, вот так у меня
Код

 $params = array('host'     => $config->database->hostname,
                    'username' => $config->database->username,
                    'password' => $config->database->password,
                    'dbname'   => $config->database->database);

    $db = Zend_Db::factory($config->database->type, $params);
    Zend_Registry::set('db', $db);
   Zend_Db_Table::setDefaultAdapter($db);

Автор: Fortop 9.4.2008, 17:41
Так не пойдет.

Либо нормально код, не кусочками, 

Или еще лучше - вот так
Код

$select = $db->select();

var_dump($select);
die();



Автор: Gulnaza 10.4.2008, 10:58
подключение к бд непосредственно перед select() результата не дало...страница сформировалась, а выборка - пустая...var_dump вывел NULL

Автор: Fortop 10.4.2008, 12:06
Вывод - у тебя просто не происходит подключение к БД.
проверь наличие коннекта простыми командами

Код

<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
$db_list = mysql_list_dbs($link);

while ($row = mysql_fetch_object($db_list)) {
     echo $row->Database . "\n";
}
?> 


если выведет результат - значит разбирайся с подключением через Zend_DB.
Если результата не будет - значит разбирайся с передаваемыми параметрами для сервера и вообще работает ли оный.

Автор: Gulnaza 10.4.2008, 14:00
хм..спасибо
var_dump вывел структурированный массив данных
значит дело в выводе информации?


Автор: Fortop 10.4.2008, 14:22
Мда. И что сделано?

Нужно было
1. проверить есть ли подключение к БД
2а. Если подключение есть - разбираться с инициализацией Zend_DB
2б. Если подключения нет - разбираться почему его нет (т.е. пароль, логин, адрес сервера и т.д., сам сервер работает ли и доступен ли).

Раз привели дамп Zend_DB, я так понимаю подключение все таки есть? (2а)
Если есть - (2а), то берем пример который давал mishaSL, и проверяем, что выдаст var_dump(get_class($select)) в нем. Если выдает имя - значит все ок. если не выдает, то 2б smile

Код

<?php
require_once 'Zend/Db.php';
// Автоматически загружает класс Zend_Db_Adapter_Pdo_Mysql
// и создает его экземпляр.
$db = Zend_Db::factory('Pdo_Mysql', array(
    'host'     => '127.0.0.1',
    'username' => 'webuser',
    'password' => 'xxxxxxxx',
    'dbname'   => 'test'
));
$select = $db->select();
var_dump(get_class($select));

Примечание, никаких чтений из config - все параметры установить руками.

А вообще - http://forum.vingrad.ru/faq/topic-200854.html

Автор: Gulnaza 10.4.2008, 14:52
спасибо за помощь
с подключением все норм
буду разбираться дальше.

Автор: Gulnaza 10.4.2008, 15:43
всем огромное спасибо
ошибка оказалась в выводе в templates

Код

{foreach from=$obj item=obj} 
<tr>
    <td><input type="checkbox" name="checks[]" value="{$obj->ob_id}"></td>
    <td>{$obj.ob_id}</td>
    <td>{$obj.ob_deal}</td>
        <td>{$obj.ob_dopinfa}</td>
    <td>{$obj.ob_adress}</td>
</tr>
{/foreach}

Автор: shadowoflion 1.7.2011, 13:36
Решила задать вопрос здесь поскольку темa подобна. Вопрос относительно Zend_Db_Adapter. Пишу сейчас аплоад фото в базу и возник такой вопрос: надо ли переписывать класс Zend_Db_Adapter_Pdo_Mysql чтобы можно было добавлять блоб типы даных?

Автор: NFL 6.7.2011, 10:01
Код

<?php
require_once 'Zend/Db.php';
// Автоматически загружает класс Zend_Db_Adapter_Pdo_Mysql
// и создает его экземпляр.
$db = Zend_Db::factory('Pdo_Mysql', array(
    'host'     => '127.0.0.1',
    'username' => 'webuser',
    'password' => 'xxxxxxxx',
    'dbname'   => 'test'
));
$select = $db->select();
var_dump(get_class($select));


Что это за извращение? smile 

Или занд уже перестал Autoloader поддерживать?;)
application.ini:
Код

resources.db.adapter = PDO_MYSQL
resources.db.params.host = Хост
resources.db.params.username = Юзер
resources.db.params.password = праоль
resources.db.params.dbname = имя_БД
resources.db.params.charset = utf8

Код


class Application_Model_orderHistory_Table extends Zend_Db_Table_Abstract {

    protected $_name = 'gs_order_status';
    protected $_primary = 'id';
        /**
         *
         * @param string $orderId - ID заказа, историю которого необходимо получить
         * @return array
         */
    public function getOrderHistory($orderId) {
        $db = $this->getAdapter();
        $select = $db->select();
        $history = $select->from($this->_name)->where('order_id = ?', $orderId)
                ->joinLeft('gs_transaction_statuses', 'gs_transaction_statuses.status = gs_order_status.status')
                ->query()->fetchAll();
        return $history;
    }
}


это кусочек из проекта, но если вам неохота заморачиваться с моделями - 

Код

        $db = new Zend_Db_Select(Zend_Db_Table::getDefaultAdapter());
        $select = $db->from($name)->join($name, $cond)->where($cond)->order($spec)->query()->fetchAll();


Без всяких там фабрик smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)