Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [zend] połączenie z bazą danych
Forum PHP.pl > Forum > PHP > Frameworki
nieraczek
Chcę zrobić coś takiego jak to opisano na tej stronie http://framework.zend.com/manual/en/zend.db.select.html:
  1. <?php
  2. $select = $db->select()
  3.    ->from( ...specify table and columns... )
  4.    ->where( ...specify search criteria... )
  5.    ->order( ...specify sorting criteria... );
  6. ?>



Jednak przed tym muszę stworzyć $db - opisali to tutaj http://framework.zend.com/manual/en/zend.db.html:
  1. <?php
  2. $db = new Zend_Db_Adapter_Pdo_Mysql(array(
  3.    'host'     => '127.0.0.1',
  4.    'username' => 'webuser',
  5.    'password' => 'xxxxxxxx',
  6.    'dbname'   => 'test'
  7. ));
  8. ?>


Tylko dlaczego ja mam podawać w Zend_Db_Adapter_Pdo_Mysql() login do bazy, hasło do bazy, nazwę bazy danych itd. - nie może tych informacji pobrać z pliku "app" położonego w application\config questionmark.gif Przecież to w tym pliku podanie się wszystkie dane potrzebne do połączenia z bazą. Jak zrobić żeby "$db" pobierało informacje z tego pliku ?
phpion
Z ZF miałem krótką styczność ale z tego co pamiętam to należało ustawić domyślny adapter dla bazy danych:
http://framework.zend.com/manual/en/zend.d...default-adapter
batman
Ja mam to zrobione w taki sposób:
  1. <?php
  2. $config_db = new Zend_Config_Ini('config/config_db.ini', 'test');
  3. $db = Zend_Db::factory($config_db->db->adapter, $config_db->db->params->toArray());
  4. ?>

oraz config_db.ini
Kod
[production]
db.adapter             = pdo_mysql
db.params.host         = localhost
db.params.username     = user_prod
db.params.password     = pass_prod
db.params.dbname      = dbname_prod
db.params.profiler    = false

[test : production]
db.params.host         = localhost
db.params.username     = user_test
db.params.password     = pass_test
db.params.dbname      = dbname_test
db.params.profiler    = true


Plik config_db.ini znajduje się u mnie w katalogu /application/config
Katalog application mam dodany do inclide path.
nieraczek
Ja umieściłem w pliku 'bootstrap.php':

  1. <?php
  2. $config = new Zend_Config_Ini('../application/config/app.ini', 'production');
  3. Zend_Registry::set('config', $config);
  4. $db = Zend_Db::factory($config->database->adapter, $config->database->params->toArray());
  5. Zend_Db_Table::setDefaultAdapter($db);
  6. ?>



A w pliku 'index.php' w funkcji 'indexAction()':
  1. <?php
  2. $select = $db->select()
  3.             ->from('ksiazki');
  4. ?>


i dostaję komunikat:
  1. <?php
  2. Call to a member function select() on a non-object
  3. ?>


Nie widzi u mnie stworzonego obiektu '$db' nie wiem dlaczego sad.gif
phpion
  1. <?php
  2. $select = $this->select()
  3.            ->from('ksiazki');
  4. ?>
nieraczek
hm..... ok, tylko po zmianie na '$this' teraz wyswietla mi sie z kolei komunikat:
  1. <?php
  2. Method "select" does not exist and was not trapped in __call()
  3. ?>
thm
w bootstrapie:
Kod
Zend_Registry::set('db', $db);


w controllerze:
Kod
$db = Zend_Registry::get('db')
$select = $db->select->from('dupa.8');


// nie lepiej korzystać z modelu?
phpion
Zacznij czytać dokumentację ZF. Wydaje mi się, że zapytanie pakujesz bezpośrednio do kontrolera podczas gdy należy je wykonać w modelu. Oto fragment mojego przykładowego modelu:
  1. <?php
  2. class Users extends Zend_Db_Table_Abstract {
  3.    protected $_name = 'users';
  4.    protected $_sequence = 'users_id_seq';
  5.    
  6.    public function checkUsername($username) {
  7.        $select = $this->select()
  8.                        ->where('username=?', $username)
  9.                        ->limit(1);
  10.        return (bool)$this->fetchAll($select)->count();
  11.    }
  12. }
  13. ?>
nieraczek
Zdaje się, że to co napisał 'thm' pomogło.

Tylko jeszcze ostatnia sprawa żeby już zakończyć, mam problem z wyświetleniem tytułów książek - zasadniczo chcę zrobić coś bardziej skomplikowanego, ale najpierw coś właśnie tak prostego, a mimo to mi nie wychodzi. Robiłem na różne sposoby i nie udaje mi się wyświetlić tytułów książek:
  1. <?php
  2. $db = Zend_Registry::get('db');
  3. $select = $db->query("SELECT * FROM ksiazki");
  4.  
  5. $res =  $db->fetchAll($select);
  6.  
  7.  
  8. foreach($res as $wiersz):
  9. echo $wiersz->tytul . "<br />";
  10. endforeach;
  11. ?>
batman
  1. <?php
  2. $select = $db->select();
  3. $select->from('ksiazki');
  4. $tab = $db->fetchAll($select)->toArray();
  5. ?>
phpion
Cytat(nieraczek @ 23.10.2008, 10:15:26 ) *
Zdaje się, że to co napisał 'thm' pomogło.

Pomogło w sensie, że działa. Jednak w ten sposób nie powinno się pisać aplikacji. Jeżeli już porywasz się na ZF to staraj się pisać porządnie, a nie byle działało. Fizycznym pobieraniem danych z bazy powinien zajmować się model, a nie kontroler.
nieraczek
Nie wiem, dziwny jest ten ZF, z 'toArray()' nie dostaje wynikow z tabeli, a z 'toArray()' mam kolejny blad:
  1. <?php
  2. Call to a member function toArray() on a non-object
  3. ?>





Staram się pisać porządnie, ale jeśli potem chciałbym pobrać dane z trzech tabel przy użyciu JOIN'a to i tak przecież musiałbym pisać w ten sposób.
batman
Z tym toArray to się trochę rozpędziłem. Mój błąd.
Usuń toArray() i zobacz co Ci wypluje var_dump($tab);
$tab to zmianna, do której zapisujesz wynik działania fetchAll.


Cytat
Staram się pisać porządnie, ale jeśli potem chciałbym pobrać dane z trzech tabel przy użyciu JOIN'a to i tak przecież musiałbym pisać w ten sposób.
Od tego masz przecież Zend_Db.
nieraczek
Wypluło mi:

array(6) { [0]=> array(6) { ["id"]=> string(1) "1" ["id_autora"]=> string(1) "1" ["id_rodzaju"]=> string(1) "1" ["tytul"]=> string(22) "Ksiazka o grzybach" ["cena"]=> string(5) "12.99" ["liczba_stron"]=> string(2) "20" } [1]=> array(6) { ["id"]=> string(1) "2" ["id_autora"]=> string(1) "1" ["id_rodzaju"]=> string(1) ....... itd.


Widzę, że ten ZF to jak nowy język i do tego do wszystkiego są własne funkcje ZF worriedsmiley.gif
batman
  1. <?php
  2. foreach($res as $wiersz):
  3.    echo $wiersz['tytul'] . "<br />";
  4. endforeach;
  5. ?>

To Ci wyświetli tytuły.
Muszę się zgodzić z opinią ~phpion. Jeśli zrobiłbyś to w modelu, wówczas znacznie szybciej można było znaleźć problem. Szczerze przyznam, że nie używam Zend_Db osobno. Wszystko robię w oparciu o model.


Cytat
Widzę, że ten ZF to jak nowy język i do tego do wszystkiego są własne funkcje ZF
Nie taki diabeł straszny jak go malują. W ZF stworzyli swoją warstę abstrakcji, która po poznaniu jest moim zdaniem bardzo przyjemna w użyciu.
nieraczek
ok - dzieki - dziala, tylko w foreach zamiast '$res' to '$tab' smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.