Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Étant en "apprentissage" d'utilisation de Zend, j'ai un petit soucis que la doc n'arrive pas à réglé :'( ...
J'arrive à récupéré et afficher facilement le contenu complet de ma BDD en utilisant
$actu = new Actu();
$this->view->actu = $actu->fetchAll();
Mais quand il s'agit de faire un WHERE (sur la requete SQL), en récupérant l'id en GET .. Je suis entièrement perdu (erreur sur erreurs :S ). Je n'arrives pas a trouvé les bonnes fonctions à utiliser !
Quelqu'un pourrait-il m'éclaircir sur une quête novice?
Merci
Hors ligne
Essaie peut être ça :
$actu = new Actu() ;
$select = $actu->select() ;
$select->where('actu = ?', $id) ;
$this->view->actu = $actu->fetchAll($select) ;
Hors ligne
Dans ton model Actu :
public function getActuById($id)
{
$select = $this->select()
->from($this->_name)
->where('actu_id = ?', $id)
return $this->fetchRow($select);
}
Dans ton controlleur :
$id = $this->_getParam('id'); // on récupère l'id en GET
$actu = new Actu();
$this->view->actu = $actu->getActuById($id);
A lire aussi cette partie :
http://framework.zend.com/manual/fr/zend.db.select.html
Mais le mieux serait de tous lire la partie concernant Zend_Db
Edit: Arf grillé
Dernière modification par alien7 (15-01-2009 23:11:03)
Hors ligne
Merci les gens
Rapide comme aide !!
Hors ligne
Juste pour dire si quelqu'un avais le meme problème, je rectifis une petite parse de alien7 :
public function getActuById($id)
{
$select = $this->select()
->from($this->_name)
->where('actu_id = ?', $id);
return $this->fetchRow($select);
}
(il manquais un ; à la ligne du where ^^).
Voila
Hors ligne
Une autre question ... Au niveau du display (phtml) j'affiche sa comment ? >_<
Car :
<?php foreach($this->actu as $actu) : ?>
<?php echo $this->escape($actu->news_titre);?>
<?php endforeach; ?>
marche pas (meme si il detecte que l'enregistrement existe :S) ...
Hors ligne
Hello,
Si actu_id est ta clé primaire, alors un simple :
$actu = new Actu(); $this->view->actu = $actu->find($id);
suffira.
A+
Hors ligne
Le problème avec un find, c'est que l'on ne peut pas specifié les champs voulu. On n'a pas forcement besoin de tous les champs. Moi je l'evite celui là.
Hors ligne
Une autre question ... Au niveau du display (phtml) j'affiche sa comment ? >_<
Car :
<?php foreach($this->actu as $actu) : ?>
<?php echo $this->escape($actu->news_titre);?>
<?php endforeach; ?>
marche pas (meme si il detecte que l'enregistrement existe :S) ...
c'est quoi ton erreur ?
A première vue c'est normal tu fait un fetchRow et non un fetchAll.
enlève le foreach.
Le problème avec un find, c'est que l'on ne peut pas specifié les champs voulu. On n'a pas forcement besoin de tous les champs. Moi je l'evite celui là.
tout a fait d'accord, je ne l'ai jamais utilisé.
Hors ligne
Hello,
alien7 a écrit:
Le problème avec un find, c'est que l'on ne peut pas specifié les champs voulu. On n'a pas forcement besoin de tous les champs. Moi je l'evite celui là.
public function getActuById($id) { $select = $this->select() ->from($this->_name) ->where('actu_id = ?', $id) return $this->fetchRow($select); }
Ta méthode fait pourtant exactement la même chose . Tu as simplement réécrit find().
A+
Dernière modification par mikaelkael (16-01-2009 12:44:13)
Hors ligne
Donc sans le foreach, j'ai ce genre d'erreur
Pour :
<?php echo $this->view->actu->news_titre;?>
sa donne :
Notice: Trying to get property of non-object in C:\wamp\www\dev\application\views\scripts\Actu\afficher.phtml on line 5
Et pour :
<?php echo $this->escape($actu->news_titre);?>
J'ai :
Notice: Trying to get property of non-object in C:\wamp\www\dev\application\views\scripts\Actu\afficher.phtml on line 12
Hors ligne
dans ta vue :
<?php echo $this->escape($this->actu->news_titre); ?>
Dernière modification par baboune (16-01-2009 14:14:06)
Hors ligne
Ultimata ->
Met ca dans ton bootstrap
$db->setFetchMode(Zend_Db::FETCH_OBJ);
mikaelkael a écrit:
Hello,
alien7 a écrit:
Le problème avec un find, c'est que l'on ne peut pas specifié les champs voulu. On n'a pas forcement besoin de tous les champs. Moi je l'evite celui là.
Code:
public function getActuById($id) { $select = $this->select() ->from($this->_name) ->where('actu_id = ?', $id) return $this->fetchRow($select); }Ta méthode fait pourtant exactement la même chose
. Tu as simplement réécrit find().
A+
Oui bien sûr là dans mon exemple je n'ai pas spécifié de champs, je ne connais pas les champs qu'il veut. Mais bon il sarrive qu'on est pas besoin de tous les champs. Enfin moi je n'ai jamais eu à l'utiliser le find.
Dernière modification par alien7 (16-01-2009 14:19:42)
Hors ligne
Merci de ton implication alien
J'aimerais savoir ou trouvé ce genre d'informations dans la doc sans passé par un forum pour mobilisé des membres à mon sujet ? :p Dans le Zend_Db ?
Pour répondre encore au soucis, j'ai sa dans l'index :
$db = Zend_Db::factory($config->db);
$db->setFetchMode(Zend_Db::FETCH_OBJ);
Zend_Db_Table::setDefaultAdapter($db);
Mais rien n'y fait.. Toujours la même erreur, je commence à être perdu dans tout sa ..
Hors ligne
Hello,
Il n'est pas nécessaire d'avoir $db->setFetchMode(Zend_Db::FETCH_OBJ);. fetchRow te retournes un objet Zend_Db_Table_Row ou null si pas de données
As-tu bien un retour de ta base, un var_dump($actu->getActuById($id)); te donnes quoi ?
A+
Hors ligne
Oui apparemment j'ai un retour. Je pense que sa viens de l'affichage (phtml) mon problème :S
Retour:
object(Zend_Db_Table_Row)#42 (8) { ["_data:protected"]=> array(4) { ["news_id"]=> string(1) "2" ["news_titre"]=> string(9) "Omagadddd" ["news_content"]=> string(11) "bah niquelk" ["news_pv"]=> string(1) "3" } ["_cleanData:protected"]=> array(4) { ["news_id"]=> string(1) "2" ["news_titre"]=> string(9) "Omagadddd" ["news_content"]=> string(11) "bah niquelk" ["news_pv"]=> string(1) "3" } ["_modifiedFields:protected"]=> array(0) { } ["_table:protected"]=> object(Actu)#24 (16) { ["_name:protected"]=> string(4) "news" ["_db:protected"]=> object(Zend_Db_Adapter_Pdo_Mysql)#5 (10) { ["_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) } ["_defaultStmtClass:protected"]=> string(21) "Zend_Db_Statement_Pdo" ["_config:protected"]=> array(6) { ["host"]=> string(9) "localhost" ["username"]=> string(4) "root" ["password"]=> string(0) "" ["dbname"]=> string(2) "tp" ["options"]=> array(2) { ["caseFolding"]=> int(0) ["autoQuoteIdentifiers"]=> bool(true) } ["driver_options"]=> array(0) { } } ["_fetchMode:protected"]=> int(5) ["_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)#26 (0) { } ["_caseFolding:protected"]=> int(0) ["_autoQuoteIdentifiers:protected"]=> bool(true) } ["_schema:protected"]=> NULL ["_cols:protected"]=> array(4) { [0]=> string(7) "news_id" [1]=> string(10) "news_titre" [2]=> string(12) "news_content" [3]=> string(7) "news_pv" } ["_primary:protected"]=> array(1) { [1]=> string(7) "news_id" } ["_identity:protected"]=> int(1) ["_sequence:protected"]=> bool(true) ["_metadata:protected"]=> array(4) { ["news_id"]=> array(14) { ["SCHEMA_NAME"]=> NULL ["TABLE_NAME"]=> string(4) "news" ["COLUMN_NAME"]=> string(7) "news_id" ["COLUMN_POSITION"]=> int(1) ["DATA_TYPE"]=> string(3) "int" ["DEFAULT"]=> NULL ["NULLABLE"]=> bool(false) ["LENGTH"]=> NULL ["SCALE"]=> NULL ["PRECISION"]=> NULL ["UNSIGNED"]=> NULL ["PRIMARY"]=> bool(true) ["PRIMARY_POSITION"]=> int(1) ["IDENTITY"]=> bool(true) } ["news_titre"]=> array(14) { ["SCHEMA_NAME"]=> NULL ["TABLE_NAME"]=> string(4) "news" ["COLUMN_NAME"]=> string(10) "news_titre" ["COLUMN_POSITION"]=> int(2) ["DATA_TYPE"]=> string(7) "varchar" ["DEFAULT"]=> NULL ["NULLABLE"]=> bool(false) ["LENGTH"]=> string(3) "255" ["SCALE"]=> NULL ["PRECISION"]=> NULL ["UNSIGNED"]=> NULL ["PRIMARY"]=> bool(false) ["PRIMARY_POSITION"]=> NULL ["IDENTITY"]=> bool(false) } ["news_content"]=> array(14) { ["SCHEMA_NAME"]=> NULL ["TABLE_NAME"]=> string(4) "news" ["COLUMN_NAME"]=> string(12) "news_content" ["COLUMN_POSITION"]=> int(3) ["DATA_TYPE"]=> string(4) "text" ["DEFAULT"]=> NULL ["NULLABLE"]=> bool(false) ["LENGTH"]=> NULL ["SCALE"]=> NULL ["PRECISION"]=> NULL ["UNSIGNED"]=> NULL ["PRIMARY"]=> bool(false) ["PRIMARY_POSITION"]=> NULL ["IDENTITY"]=> bool(false) } ["news_pv"]=> array(14) { ["SCHEMA_NAME"]=> NULL ["TABLE_NAME"]=> string(4) "news" ["COLUMN_NAME"]=> string(7) "news_pv" ["COLUMN_POSITION"]=> int(4) ["DATA_TYPE"]=> string(3) "int" ["DEFAULT"]=> NULL ["NULLABLE"]=> bool(false) ["LENGTH"]=> NULL ["SCALE"]=> NULL ["PRECISION"]=> NULL ["UNSIGNED"]=> NULL ["PRIMARY"]=> bool(false) ["PRIMARY_POSITION"]=> NULL ["IDENTITY"]=> bool(false) } } ["_metadataCache:protected"]=> NULL ["_metadataCacheInClass:protected"]=> bool(true) ["_rowClass:protected"]=> string(17) "Zend_Db_Table_Row" ["_rowsetClass:protected"]=> string(20) "Zend_Db_Table_Rowset" ["_referenceMap:protected"]=> array(0) { } ["_dependentTables:protected"]=> array(0) { } ["_defaultSource:protected"]=> string(11) "defaultNone" ["_defaultValues:protected"]=> array(0) { } } ["_connected:protected"]=> bool(true) ["_readOnly:protected"]=> bool(false) ["_tableClass:protected"]=> string(4) "Actu" ["_primary:protected"]=> array(1) { [1]=> string(7) "news_id" } }
Hors ligne
Hello,
Dans ta vue, fais
<?php echo $this->actu->news_titre;?>
et pas
<?php echo $this->view->actu->news_titre;?>
A+
Hors ligne
Salut,
Je n'ai pas l'impression de voir de données dans ce que tu dump (ni de champ 'actu_id' d'ailleurs, mais je suppose que c'était pour l'exemple)
Sinon pour info (même si ce n'est pas ce que t'utilises), attention quand on utilise la méthode find(), il ne faut pas oublié de faire un current() derrière.
Autre remarque pour tout le monde, la méthode find() n'est effectivement pas très utile lorsqu'on ne veut pas récupérer tous les champs de la table, cependant elle est très utile quand il s'agit de récupérer des enregistrements par clé(s) primaire(s) composée(s).
A+ benjamin.
Dernière modification par Delprog (16-01-2009 14:52:19)
Hors ligne
ça marche tres bien avec
<?php echo $this->escape($this->actu->news_titre); ?>
Hors ligne
Hello,
@Delprog: c'est un objet Zend_Db_Table_Row, __get() va récupérer la valeur de la clé dans le tableau _data qui est bien présent.
En tout cas pour news_titre mais effectivement pas d'actu_id .
A+
Dernière modification par mikaelkael (16-01-2009 14:54:52)
Hors ligne
Le problème étais effectivement dans la vue !!
<?php echo $this->actu->news_titre;?>
C'était la bonne syntaxe
Merci à vous tous pour cet aide!
Hors ligne