Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [zend] połączenie z bazą danych
nieraczek
post
Post #1





Grupa: Zarejestrowani
Postów: 405
Pomógł: 6
Dołączył: 12.01.2007

Ostrzeżenie: (0%)
-----


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 ?
Go to the top of the page
+Quote Post
phpion
post
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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
Go to the top of the page
+Quote Post
batman
post
Post #3





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




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.


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
nieraczek
post
Post #4





Grupa: Zarejestrowani
Postów: 405
Pomógł: 6
Dołączył: 12.01.2007

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
phpion
post
Post #5





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




  1. <?php
  2. $select = $this->select()
  3.            ->from('ksiazki');
  4. ?>
Go to the top of the page
+Quote Post
nieraczek
post
Post #6





Grupa: Zarejestrowani
Postów: 405
Pomógł: 6
Dołączył: 12.01.2007

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
thm
post
Post #7





Grupa: Zarejestrowani
Postów: 52
Pomógł: 10
Dołączył: 6.10.2008
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
phpion
post
Post #8





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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. ?>
Go to the top of the page
+Quote Post
nieraczek
post
Post #9





Grupa: Zarejestrowani
Postów: 405
Pomógł: 6
Dołączył: 12.01.2007

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował nieraczek 23.10.2008, 09:16:14
Go to the top of the page
+Quote Post
batman
post
Post #10





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




  1. <?php
  2. $select = $db->select();
  3. $select->from('ksiazki');
  4. $tab = $db->fetchAll($select)->toArray();
  5. ?>


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
phpion
post
Post #11





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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.
Go to the top of the page
+Quote Post
nieraczek
post
Post #12





Grupa: Zarejestrowani
Postów: 405
Pomógł: 6
Dołączył: 12.01.2007

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
batman
post
Post #13





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




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.


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
nieraczek
post
Post #14





Grupa: Zarejestrowani
Postów: 405
Pomógł: 6
Dołączył: 12.01.2007

Ostrzeżenie: (0%)
-----


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

Ten post edytował nieraczek 23.10.2008, 13:59:44
Go to the top of the page
+Quote Post
batman
post
Post #15





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




  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.


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
nieraczek
post
Post #16





Grupa: Zarejestrowani
Postów: 405
Pomógł: 6
Dołączył: 12.01.2007

Ostrzeżenie: (0%)
-----


ok - dzieki - dziala, tylko w foreach zamiast '$res' to '$tab' smile.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 04:53