[ZF] Select queries (Opgelost)
DMM - 22/03/2008 21:22
PHP 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:
// Altijd gedefinieerd:
$paginas = new Paginas();
//
// IndexController.php
$this->view->paginas = $paginas->fetchAll("paginalink = $paginalink AND type = 1")
// index.phtml
foreach( $this->paginas as $row ) :
endforeach;
// IndexController.php
$stmt = $paginas->query('SELECT * FROM paginas WHERE paginalink = '.$paginalink.' AND type = 1');
$rows = $stmt->fetchAll();
// index.phtml
foreach( $rows as $row ) :
endforeach;
// IndexController.php
$selectSubmenu = $db->select()
->from('paginas')
->where('parent ?', '0')
->type('type ?', '1')
->order('paginaid ASC')
->limit('1');
// index.phtml
foreach( $selectSubmenu as $row ) :
endforeach;
// Altijd gedefinieerd:
$paginas = new Paginas( ) ;
//
// IndexController.php
$this -> view -> paginas = $paginas -> fetchAll ( "paginalink = $paginalink AND type = 1" )
// index.phtml
foreach ( $this -> paginas as $row ) :
endforeach ;
// IndexController.php
$stmt = $paginas -> query ( 'SELECT * FROM paginas WHERE paginalink = ' . $paginalink . ' AND type = 1' ) ;
$rows = $stmt -> fetchAll ( ) ;
// index.phtml
foreach ( $rows as $row ) :
endforeach ;
// IndexController.php
$selectSubmenu = $db -> select ( )
-> from ( 'paginas' )
-> where ( 'parent ?' , '0' )
-> type ( 'type ?' , '1' )
-> order ( 'paginaid ASC' )
-> limit ( '1' ) ;
// index.phtml
foreach ( $selectSubmenu as $row ) :
endforeach ;
Kan iemand het mij even verduidelijken?
Bedankt alvast
David Roelandt
19 antwoorden
Gesponsorde links
Stijn - 22/03/2008 21:46
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.
DMM - 22/03/2008 21:51 (laatste wijziging 22/03/2008 21:52)
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?
Stijn - 22/03/2008 21:56
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?
DMM - 22/03/2008 21:59
PHP beginner
Ik denk het wel, dit staat er in paginas.php (model):
class Paginas extends Zend_Db_Table
{
protected $_name = 'paginas';
}
class Paginas extends Zend_Db_Table
{
protected $_name = 'paginas' ;
}
Stijn - 23/03/2008 06:31
PHP expert
Ja, dat is correct je model.
DMM - 23/03/2008 10:56 (laatste wijziging 23/03/2008 10:59)
PHP beginner
Aan wat zou het dan kunnen liggen? Hieronder staat enkele code die ik gebruik en misschien ligt het daaraan...
// IndexController.php
class IndexController extends Zend_Controller_Action
{
function init()
{
// init-functie
$this->initView();
// database inladen
include './application/models/paginas.php';
$this->view->user = Zend_Auth::getInstance()->getIdentity();
}
function indexAction()
{
$paginas = new Paginas();
$selectSubmenu = $paginas->select()
->from('paginas')
->where('paginalink ?', $paginalink)
->where('type ?', '1');
}
}
// index.php (bootstrap)
$options = array(
'host' => 'localhost' ,
'username' => 'root' ,
'password' => '' ,
'dbname' => 'test'
);
$db = Zend_Db::factory( 'PDO_MYSQL' , $options );
Zend_Db_Table::setDefaultAdapter( $db );
// index.phtml
<?php foreach( $selectSubmenu as $row ) : ?>
<li><?=$row->titel?></li>
<?php endforeach; ?>
// paginas.php (model)
// Zie vorige post
// IndexController.php
class IndexController extends Zend_Controller_Action
{
function init()
{
// init-functie
$this->initView();
// database inladen
include './application/models/paginas.php';
$this->view->user = Zend_Auth::getInstance()->getIdentity();
}
function indexAction()
{
$paginas = new Paginas();
$selectSubmenu = $paginas->select()
->from('paginas')
->where('paginalink ?', $paginalink)
->where('type ?', '1');
}
}
// index.php (bootstrap)
$options = array(
'host' => 'localhost' ,
'username' => 'root' ,
'password' => '' ,
'dbname' => 'test'
);
$db = Zend_Db::factory( 'PDO_MYSQL' , $options );
Zend_Db_Table::setDefaultAdapter( $db );
// index.phtml
<?php foreach ( $selectSubmenu as $row ) : ?>
<li><?= $row -> titel ?> </li>
<?php endforeach ; ?>
// paginas.php (model)
// Zie vorige post
Edit: Volledige bootstrap: http://plaatscode.be/6249 /
Stijn - 23/03/2008 12:45
PHP expert
Je kan de select() methode enkel uitvoeren mbv de adapter, dus je select moet er als volgt uit zien.
$paginas->getAdapter()->select()->....
$paginas -> getAdapter ( ) -> select ( ) ->....
DMM - 23/03/2008 13:09
PHP beginner
Ik heb er nu zoiets van gemaakt:
// IndexController.php
$selectSubmenu = $paginas->getAdapter()->select()
->from('paginas')
->where('parent ?', '0')
->where('type ?', '1')
->order('paginaid ASC')
->limit('1');
$selectNieuwsBerichten = $paginas->getAdapter()->select()
->from('nieuws')
->order('datum ASC')
->limit('3');
$selectHoofdMenu = $paginas->getAdapter()->select()
->from('paginas')
->where('parent = ?', '0')
->where('type = ?', '0')
->limit('6');
// index.phtml
foreach( $selectSubmenu as $row ) :
echo $row->titel;
endforeach;
foreach( $selectNieuwsBerichten as $row ) :
echo $row->titel;
endforeach;
// enzovoort
// IndexController.php
$selectSubmenu = $paginas -> getAdapter ( ) -> select ( )
-> from ( 'paginas' )
-> where ( 'parent ?' , '0' )
-> where ( 'type ?' , '1' )
-> order ( 'paginaid ASC' )
-> limit ( '1' ) ;
$selectNieuwsBerichten = $paginas -> getAdapter ( ) -> select ( )
-> from ( 'nieuws' )
-> order ( 'datum ASC' )
-> limit ( '3' ) ;
$selectHoofdMenu = $paginas -> getAdapter ( ) -> select ( )
-> from ( 'paginas' )
-> where ( 'parent = ?' , '0' )
-> where ( 'type = ?' , '0' )
-> limit ( '6' ) ;
// index.phtml
foreach ( $selectSubmenu as $row ) :
endforeach ;
foreach ( $selectNieuwsBerichten as $row ) :
endforeach ;
// 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
DMM - 23/03/2008 21:42
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) { } }
Stijn - 24/03/2008 00:08
PHP expert
In je controller moet je $this->view->selectNieuwsBerichten = $paginas->getAdapter()->.... doen en in je view foreach( $this->selectNieuwsBerichten as ... ).
DMM - 24/03/2008 11:40
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
Ibrahim - 24/03/2008 16:58
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.
DMM - 24/03/2008 17:55
PHP beginner
Op deze manier dan?
$this->view->selectNieuwsBerichten = $paginas->getAdapter()->select()
->from('nieuws')
->order('datum ASC')
->limit('3')
->toArray();
$this -> view -> selectNieuwsBerichten = $paginas -> getAdapter ( ) -> select ( )
-> from ( 'nieuws' )
-> order ( 'datum ASC' )
-> limit ( '3' )
-> 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?
Grayen - 24/03/2008 18:25
PHP ver gevorderde
$this->view->selectNieuwsBerichten = $paginas->getAdapter()->select()
->from('nieuws')
->order('datum ASC')
->limit('3')
->query()
->toArray();
$this -> view -> selectNieuwsBerichten = $paginas -> getAdapter ( ) -> select ( )
-> from ( 'nieuws' )
-> order ( 'datum ASC' )
-> limit ( '3' )
-> query ( )
-> toArray ( ) ;
DMM - 24/03/2008 18:40
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?
Grayen - 24/03/2008 19:00
PHP ver gevorderde
Ow, dan zal dit waarschijnlijk wel werken:
$this->view->selectNieuwsBerichten = $paginas->getAdapter()->select()
->from('nieuws')
->order('datum ASC')
->limit('3')
->query()
->fetchAll();
$this -> view -> selectNieuwsBerichten = $paginas -> getAdapter ( ) -> select ( )
-> from ( 'nieuws' )
-> order ( 'datum ASC' )
-> limit ( '3' )
-> query ( )
-> fetchAll ( ) ;
Stijn - 24/03/2008 19:20
PHP expert
Inderdaad, het staat ook beschreven in de ZF manual .
DMM - 24/03/2008 21:02 (laatste wijziging 24/03/2008 21:12)
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:
<?php foreach( $this->selectNieuwsBerichten as $row ): ?>
<li>
<a href="/damama/index?pagina=<?php echo $row->paginalink; ?>&subpagina=<? echo $row->subpaginalink; ?>"><?php echo $row->titel; ?></a>
</li>
<?php endforeach; ?>
<?php foreach ( $this -> selectNieuwsBerichten as $row ) : ?>
<li>
<a href="/damama/index?pagina=
<?php echo $row -> paginalink ; ?> &subpagina=
<? echo $row -> subpaginalink ; ?> ">
<?php echo $row -> titel ; ?> </a>
</li>
<?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 .