login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[ZF] Select queries (Opgelost)

Offline DMM - 22/03/2008 21:22
Avatar van DMMPHP beginner Hallo

Momenteel ben ik wat aan het experimenteren met het Zend Framework. Daarbij doe ik beroep op de officiële Reference Guide en op de tutorialreeks van Stijn Leenknegt. Ik begrijp wel niet goed hoe het precies zit met de Select-query. Op de website van ZF lijkt het mij dat er verschillende mogelijkheden zijn en ik geraak er niet uit.

Op pagina's waarbij slechts één query uitgevoerd moet worden, gebruik is de "select-query methode" van Stijn Leenknegt. Maar vanaf meerdere queries per pagina, loopt het fout.

Volgende zaken heb ik reeds gebruikt, maar lopen fout af:

  1. // Altijd gedefinieerd:
  2. $paginas = new Paginas();
  3. //
  4.  
  5. // IndexController.php
  6. $this->view->paginas = $paginas->fetchAll("paginalink = $paginalink AND type = 1")
  7. // index.phtml
  8. foreach( $this->paginas as $row ) :
  9. endforeach;
  10.  
  11. // IndexController.php
  12. $stmt = $paginas->query('SELECT * FROM paginas WHERE paginalink = '.$paginalink.' AND type = 1');
  13. $rows = $stmt->fetchAll();
  14. // index.phtml
  15. foreach( $rows as $row ) :
  16. endforeach;
  17.  
  18. // IndexController.php
  19. $selectSubmenu = $db->select()
  20. ->from('paginas')
  21. ->where('parent ?', '0')
  22. ->type('type ?', '1')
  23. ->order('paginaid ASC')
  24. ->limit('1');
  25. // index.phtml
  26. foreach( $selectSubmenu as $row ) :
  27. endforeach;


Kan iemand het mij even verduidelijken?

Bedankt alvast

David Roelandt

19 antwoorden

Gesponsorde links
Offline Stijn - 22/03/2008 21:46
Avatar van Stijn PHP expert $paginas is een instantie van je Model. Je model biedt een aantal functies aan om te werken met die tabel. De methode fetchAll() aanvaardt geen SQL queries maar een array van voorwaarden. De methode fetchAll() returnt een object.

De tweede methode is ook niet correct (althans iets dat ik niet ken). Je kan via $paginas->getAdapter()->fetchAll(). Deze fetchAll methode aanvaardt enkel SQL queries. (bv: $paginas->getAdapter()->fetchall("SELECT * FROM tabel");). De methode fetchAll() returnt een array en geen object!

De derde methode zou moeten werken. Alhoewel die functie type() niet ken.

Je moet anders maar eens een var_dump() doen van je resultaten. Zo doe ik het altijd als er iets niet klopt.
Offline DMM - 22/03/2008 21:51 (laatste wijziging 22/03/2008 21:52)
Avatar van DMM PHP beginner Oké, bedankt voor het snelle antwoord Stijn! Als ik de derde methode probeer, krijg ik volgende error:
Citaat:
Fatal error: Call to undefined method Paginas::select() in ***


Edit: Wat betreft die var_dump(), maar moet ik dat plaatsen? In de view of in de controller?
Offline Stijn - 22/03/2008 21:56
Avatar van Stijn PHP expert Je kan die var_dump in je controller plaatsen en dan een exit(); erna. Zo kan je snel debuggen. Je model extend toch wel van Zend_Db_Table class?
Offline DMM - 22/03/2008 21:59
Avatar van DMM PHP beginner Ik denk het wel, dit staat er in paginas.php (model):
  1. class Paginas extends Zend_Db_Table
  2. {
  3.  
  4. protected $_name = 'paginas';
  5.  
  6. }
Offline Stijn - 23/03/2008 06:31
Avatar van Stijn PHP expert Ja, dat is correct je model.
Offline DMM - 23/03/2008 10:56 (laatste wijziging 23/03/2008 10:59)
Avatar van DMM PHP beginner Aan wat zou het dan kunnen liggen? Hieronder staat enkele code die ik gebruik en misschien ligt het daaraan...
  1. // IndexController.php
  2. class IndexController extends Zend_Controller_Action
  3. {
  4. function init()
  5. {
  6. // init-functie
  7. $this->initView();
  8.  
  9. // database inladen
  10. include './application/models/paginas.php';
  11. $this->view->user = Zend_Auth::getInstance()->getIdentity();
  12. }
  13.  
  14. function indexAction()
  15. {
  16. $paginas = new Paginas();
  17. $selectSubmenu = $paginas->select()
  18. ->from('paginas')
  19. ->where('paginalink ?', $paginalink)
  20. ->where('type ?', '1');
  21. }
  22.  
  23. }
  24.  
  25. // index.php (bootstrap)
  26. $options = array(
  27. 'host' => 'localhost' ,
  28. 'username' => 'root' ,
  29. 'password' => '' ,
  30. 'dbname' => 'test'
  31. );
  32. $db = Zend_Db::factory( 'PDO_MYSQL' , $options );
  33. Zend_Db_Table::setDefaultAdapter( $db );
  34.  
  35. // index.phtml
  36. <?php foreach( $selectSubmenu as $row ) : ?>
  37. <li><?=$row->titel?></li>
  38. <?php endforeach; ?>
  39.  
  40. // paginas.php (model)
  41. // Zie vorige post


Edit: Volledige bootstrap: http://plaatscode.be/6249/
Offline Stijn - 23/03/2008 12:45
Avatar van Stijn PHP expert Je kan de select() methode enkel uitvoeren mbv de adapter, dus je select moet er als volgt uit zien.

  1. $paginas->getAdapter()->select()->....
Offline DMM - 23/03/2008 13:09
Avatar van DMM PHP beginner Ik heb er nu zoiets van gemaakt:
  1. // IndexController.php
  2. $selectSubmenu = $paginas->getAdapter()->select()
  3. ->from('paginas')
  4. ->where('parent ?', '0')
  5. ->where('type ?', '1')
  6. ->order('paginaid ASC')
  7. ->limit('1');
  8.  
  9. $selectNieuwsBerichten = $paginas->getAdapter()->select()
  10. ->from('nieuws')
  11. ->order('datum ASC')
  12. ->limit('3');
  13.  
  14. $selectHoofdMenu = $paginas->getAdapter()->select()
  15. ->from('paginas')
  16. ->where('parent = ?', '0')
  17. ->where('type = ?', '0')
  18. ->limit('6');
  19.  
  20. // index.phtml
  21. foreach( $selectSubmenu as $row ) :
  22. echo $row->titel;
  23. endforeach;
  24.  
  25. foreach( $selectNieuwsBerichten as $row ) :
  26. echo $row->titel;
  27. endforeach;
  28.  
  29. // enzovoort


De foutmeldingen:
Citaat:
Notice: Undefined variable: selectNieuwsBerichten (en al de andere)
Warning: Invalid argument supplied for foreach()


Weet jij hoe ik dit kan verhelpen?

Bedankt alvast
Offline Stijn - 23/03/2008 14:31
Avatar van Stijn PHP expert Doe eens een var_dump van $selectNieuwsBerichten .
Offline DMM - 23/03/2008 21:42
Avatar van DMM PHP beginner Oké. Dit is het resultaat (ik zie niet waar de fout zou kunnen liggen):

Citaat:
object(Zend_Db_Select)#24 (3) { ["_adapter:protected"]=> object(Zend_Db_Adapter_Pdo_Mysql)#5 (9) { ["_pdoType:protected"]=> string(5) "mysql" ["_numericDataTypes:protected"]=> array(16) { [0]=> int(0) [1]=> int(1) [2]=> int(2) ["INT"]=> int(0) ["INTEGER"]=> int(0) ["MEDIUMINT"]=> int(0) ["SMALLINT"]=> int(0) ["TINYINT"]=> int(0) ["BIGINT"]=> int(1) ["SERIAL"]=> int(1) ["DEC"]=> int(2) ["DECIMAL"]=> int(2) ["DOUBLE"]=> int(2) ["DOUBLE PRECISION"]=> int(2) ["FIXED"]=> int(2) ["FLOAT"]=> int(2) } ["_config:protected"]=> array(6) { ["host"]=> string(9) "localhost" ["username"]=> string(4) "root" ["password"]=> string(0) "" ["dbname"]=> string(4) "test" ["options"]=> array(2) { ["caseFolding"]=> int(0) ["autoQuoteIdentifiers"]=> bool(true) } ["driver_options"]=> array(0) { } } ["_fetchMode:protected"]=> int(2) ["_profiler:protected"]=> object(Zend_Db_Profiler)#6 (4) { ["_queryProfiles:protected"]=> array(0) { } ["_enabled:protected"]=> bool(false) ["_filterElapsedSecs:protected"]=> NULL ["_filterTypes:protected"]=> NULL } ["_defaultProfilerClass:protected"]=> string(16) "Zend_Db_Profiler" ["_connection:protected"]=> object(PDO)#23 (0) { } ["_caseFolding:protected"]=> int(0) ["_autoQuoteIdentifiers:protected"]=> bool(true) } ["_parts:protected"]=> array(10) { ["distinct"]=> bool(false) ["forupdate"]=> bool(false) ["columns"]=> array(1) { [0]=> array(3) { [0]=> string(7) "paginas" [1]=> string(1) "*" [2]=> NULL } } ["from"]=> array(1) { ["paginas"]=> array(4) { ["joinType"]=> string(10) "inner join" ["schema"]=> NULL ["tableName"]=> string(7) "paginas" ["joinCondition"]=> NULL } } ["where"]=> array(2) { [0]=> string(12) "(parent '0')" [1]=> string(14) "AND (type '1')" } ["group"]=> array(0) { } ["having"]=> array(0) { } ["order"]=> array(1) { [0]=> array(2) { [0]=> string(8) "paginaid" [1]=> string(3) "ASC" } } ["limitcount"]=> int(1) ["limitoffset"]=> int(0) } ["_tableCols:protected"]=> array(0) { } }
Offline Stijn - 24/03/2008 00:08
Avatar van Stijn PHP expert In je controller moet je $this->view->selectNieuwsBerichten = $paginas->getAdapter()->.... doen en in je view foreach( $this->selectNieuwsBerichten as ... ).
Offline DMM - 24/03/2008 11:40
Avatar van DMM PHP beginner Hmm, ik heb dit aangepast. Nu krijg ik wel geen enkele (fout)melding meer. Zelf met een try..catch eromheen verandert er niets. Verder ben ik er zeker van dat zowel de database als de tabel bestaan.

Dit is mijn IndexController (vereenvoudigd): http://plaatscode.be/6259/
Dit is mijn index.phtml (vereenvoudigd): http://plaatscode.be/6260/
Dit is mijn bootstrapper: http://plaatscode.be/6261/
De var_dump van selectSubmenu: http://plaatscode.be/6262/

Weet iemand waaraan de fout ligt?

Bedankt
Offline Ibrahim - 24/03/2008 16:58
Avatar van Ibrahim PHP expert Je mist de toArray(); functie. Dit doe je meteen achter de limit() functie.

Deze functie zet de Model object om in een leesbare Array waarin je dus in je view kunt loopen.
Offline DMM - 24/03/2008 17:55
Avatar van DMM PHP beginner Op deze manier dan?
  1. $this->view->selectNieuwsBerichten = $paginas->getAdapter()->select()
  2. ->from('nieuws')
  3. ->order('datum ASC')
  4. ->limit('3')
  5. ->toArray();


Want dan krijg ik de foutmelding:
Citaat:
Fatal error: Call to undefined method Zend_Db_Select::toArray()

Op welke manier kan ik die method wel definiëren?
Offline Grayen - 24/03/2008 18:25
Avatar van Grayen PHP ver gevorderde
  1. $this->view->selectNieuwsBerichten = $paginas->getAdapter()->select()
  2. ->from('nieuws')
  3. ->order('datum ASC')
  4. ->limit('3')
  5. ->query()
  6. ->toArray();
Offline DMM - 24/03/2008 18:40
Avatar van DMM PHP beginner Het spijt mij maar dan krijg ik deze foutmelding:
Citaat:
Fatal error: Call to undefined method Zend_Db_Statement_Pdo::toArray()


Hoe moet ik die method definiëren?
Offline Grayen - 24/03/2008 19:00
Avatar van Grayen PHP ver gevorderde Ow, dan zal dit waarschijnlijk wel werken:

  1. $this->view->selectNieuwsBerichten = $paginas->getAdapter()->select()
  2. ->from('nieuws')
  3. ->order('datum ASC')
  4. ->limit('3')
  5. ->query()
  6. ->fetchAll();
Offline Stijn - 24/03/2008 19:20
Avatar van Stijn PHP expert Inderdaad, het staat ook beschreven in de ZF manual.
Offline DMM - 24/03/2008 21:02 (laatste wijziging 24/03/2008 21:12)
Avatar van DMM PHP beginner Bedankt Stijn, Grayen en Psycho! Ik denk dat het controller-gedeelte goed werkt. Een laatste probleem heb ik nu nog bij het view-gedeelte. Als dat gelukt is, kan ik verschillende applicaties termineren. In mijn index.phtml staat dit:
  1. <?php foreach( $this->selectNieuwsBerichten as $row ): ?>
  2.  
  3. <li>
  4. <a href="/damama/index?pagina=<?php echo $row->paginalink; ?>&subpagina=<? echo $row->subpaginalink; ?>"><?php echo $row->titel; ?></a>
  5. </li>
  6.  
  7. <?php endforeach; ?>


Daarbij krijg ik de notice: Trying to get property of non-object.

Edit: Het is gelukt. Voor degene die geïnteresseerd zijn: i.p.v. bvb. $row->titel moet het $row['titel'] zijn.
Nogmaals bedankt voor de hulp!
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.416s