IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend Framework PHP Discussion :

Problème avec find()


Sujet :

Zend Framework PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 10
    Par défaut Problème avec find()
    Salut

    je bosse actuellement sur un back-office d'un site : j'affiche les enregistrements et je dois pouvoir les modifier ou supprimer ou en ajouter grâce aux liens Modifier, supprimer, ajouter :

    donc voila le code du controleur qui me pose problème lors de l'enregistrement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    public function saveAction()
    {
    	require_once 'modules/disponibilite/models/formulairedisponibilite.php';
    	$this->view->titleedit = "Sauvegarder Article";
            $form = new FormulaireDisponibilite();
            $form->submit->setLabel('Enregistrer !!');
            $this->view->form = $form;
     
            if ($this->_request->isPost()) {
                     $formData = $this->_request->getPost();
                     if ($form->isValid($formData)) {
                             $disponibilite = new Disponibilite();
                             $id = (int)$form->getValue('id');
                             $row = $disponibilite->find($id);
                             $row->num_villa = $form->getValue('numvilla');
                             $row->type_villa = $form->getValue('typevilla');
    	                 $row->surface_rdc = $form->getValue('surfacerdc');
                             $row->surface_etage = $form->getValue('surfaceetage');
    			 $row->surface_habitable = $form->getValue('surfacehabitable');
                             $row->surface_plancher = $form->getValue('surfaceplancher');
    			 $row->surface_jardin = $form->getValue('surfacejardin');
                             $row->surface_totale = $form->getValue('surfacetotale');
                             $row->save(); // La ligne qui pose Problème :@
     
                             $this->_redirect('/disponibilite/admin');
                     }
    		 else {
                             $form->populate($formData);
                     }
             }
    	 else {
                     $id = (int)$this->_getParam('id', 0);
                     if ($id > 0) {
                            $disponibilite = new Disponibilite();
                            $dispo = $disponibilite->find($id) ;
    			$form->numvilla->setValue($dispo->num_villa) ;
    			$form->typevilla->setValue($dispo->type_villa) ;
    			$form->surfacerdc->setValue($dispo->surface_rdc) ;
    			$form->surfaceetage->setValue($dispo->surface_etage) ;
    			$form->surfacehabitable->setValue($dispo->surface_habitable) ;
    			$form->surfaceplancher->setValue($dispo->surface_plancher) ;
    			$form->surfacejardin->setValue($dispo->surface_jardin) ;
    			$form->surfacetotale->setValue($dispo->surface_totale) ;
                            //$form->populate($dispo->toArray());
                     }
             }
    }
    (j'ai utilisé setValue car populate ne voulait pas fonctionner )

    et quand je clique sur "Enregistrer !!" j'ai une jolie erreur qui sort :

    Fatal error: Call to undefined method Zend_Db_Table_Rowset::save() in /opt/lampp/htdocs/jardinDeLaColline/zr/modules/disponibilite/controllers/AdminController.php on line 41

    Des idées sur ce problème ??

    Merci d'avance

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2009
    Messages : 736
    Par défaut
    Essai avec à la place de find()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $disponibilite->fetchRow($disponibilite->select()
                                ->where('id = ?', 1));
    find() retournent un objet de type Zend_Db_Table_Rowset par contre
    fetchRow() retourne un objet de type Zend_Db_Table_Row ou il y a la method save.

  3. #3
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2009
    Messages : 736
    Par défaut
    Pour respecter le Pattern MVC les requêtes vers la base doivent être séparer du C (Controller), c'est le travail des M (Models).

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 10
    Par défaut
    Merci

    Apparemment j'ai toujours un problème avec save() :

    Fatal error: Call to a member function save() on a non-object in /opt/lampp/htdocs/jardinDeLaColline/zr/modules/disponibilite/controllers/AdminController.php on line 66

  5. #5
    Membre Expert
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    Février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 813
    Par défaut
    Il te faut faire le save sur l objet row

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 10
    Par défaut
    Même en utilisant le fetchRow ca marche pas

  7. #7
    Membre éprouvé Avatar de Alcide_
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 79
    Par défaut
    La méthode "find()" retourne un rowset donc il te faut récupérer ton row avec la méthode "current()".
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $myRow = $table->find($id)->current();

  8. #8
    Membre Expert
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    Février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 813
    Par défaut
    Citation Envoyé par Alcide_ Voir le message
    La méthode "find()" retourne un rowset donc il te faut récupérer ton row avec la méthode "current()".
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $myRow = $table->find($id)->current();
    Tu devrais lire tout le topic avant de répondre car cela a été évoqué par m4riachi

  9. #9
    Membre éprouvé Avatar de Alcide_
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 79
    Par défaut
    Pardon, il est vrai que mon message était incomplet... Rectifions :
    Comme le dit précédemment m4riachi,
    La méthode "find()" retourne un rowset donc
    si tu veux récupérer un row (et vue que personne n'a parler de "current()" dans ce topic )
    il te faut récupérer ton row avec la méthode "current()".
    Cela me semble plus approprié pour faire des recherches sur les clés primaires et accessoirement plus simple.
    Voici un petit
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $myRow = $table->find($id)->current();
    Après, pour être sûr d'avoir un enregistrement, tu peux vérifier avec un "count()" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $rowset = $table->find($id);
    if(count($rowset)>0){
        $myRow = $rowset->current();
    }
    tu éviteras les erreurs "Call to a member function ... on a non-object".
    Si tu veux plutôt utiliser "fetchRow()" tu peux tester l'existence de ton row comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /*en condensé */
    if(($myRow = $table->fetchRow('id = '.$id)) != null){
        /*du code...*/
    }
    Citation Envoyé par 5h4rk Voir le message
    Tu devrais lire tout le topic avant de répondre car cela a été évoqué par m4riachi
    Tu devrais plutôt aider les personnes de ce forum avec des posts constructifs au lieu de jouer au redresseur de torts.

  10. #10
    Membre Expert
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    Février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 813
    Par défaut
    Justement c'est ce que je fais et j'attends ses réponses avant de poster de nouveau mais quand il faut rectifier j'en prend la peine car ce forum est trés peu modérer en ce moment donc il faut au moins que ceux qui répondent y mettent du leur.

    Et si tu regarde bien sont problème ma réponse en fait partie car il tente soit de faire un save quelque chose qui n'est pas un row et cette méthode fonctionne sur un row.

    Pour rappel un row est une ligne d'un rowset donc en gros quand :
    ou
    Le retour est un rowset donc un ensemble de résultat, pour récupérer le premier il est possible d'y appliquer current() ou encore de le parcourir à travers d'un foreach ou chaque passage correspondra à un row

    il est également possible comme cela a déjà été précisé, d'utiliser
    Qui lui retourne un seul résultat correspond à un row

    Par contre ce genre de message est plus que bizarre de ta part :
    $rowset = $table->find($id);
    if(count($rowset)>0){
    $myRow = $rowset->current();
    }
    Si le find ne retourne pas de résultat c'est un NULL qui est stocké dans rowset donc fair eun count dessus est inutile même si ça fonctionne, car cela peut poser des problèmes de conception à certains moment.

    pourquoi ne pas avoir fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $rowset = $table->find($id);
    if(!empty($rowset)){
        $myRow = $rowset->current();
    }
    Si j'insiste et corrige par moment c'est que les personnes qui demandent de l'aide ne savent pas exactement procéder et je ne tiens pas à leur faire prendre de mauvaises manières.

    Cela dit il m'est également possible de dire des âneries et dans ce cas là me corriger.

  11. #11
    Membre éprouvé Avatar de Alcide_
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 79
    Par défaut
    La méthode "find()" ne renvoi pas un NULL si il n'y a pas d'enregistrement...
    la doc sur "find()"
    Et je cite :
    Quoiqu'il en soit, l'objet de retour est bien un Zend_Db_Table_Rowset_Abstract.
    La methode fetchAll() non plus d'ailleurs...
    la doc sur les "Rowset"
    Je cite :
    Un requête légitime peut retourner zéro enregistrement, donc zéro Rows. De ce fait, un objet Rowset peut contenir zéro objet Row. Comme Zend_Db_Table_Rowset_Abstract implémente l'interface Countable, vous pouvez utiliser la fonction PHP count() dessus, pour compter les Rows qu'il contient.
    et il y a même un magnifique exemple dans la doc:
    Exemple #2 Compter les Rows dans un Rowset
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        $rowset   = $bugs->fetchAll("bug_status = 'FIXED'");
     
        $rowCount = count($rowset);
     
        if ($rowCount > 0) {
            echo "$rowCount rows trouvés";
        } else {
            echo 'Pas de rows pour cette requête';
        }
    et comme les sources ne mentent jamais (ZF 1.11.5) :
    méthode "find()" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        /* 
         * @param  mixed $key The value(s) of the primary keys.
         * @return Zend_Db_Table_Rowset_Abstract Row(s) matching the criteria.
         * @throws Zend_Db_Table_Exception
         */
        public function find()
        {
              /***/
              return $this->fetchAll($whereClause);
         }
    méthode "fetchAll()" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       /*
        * @return Zend_Db_Table_Rowset_Abstract The row results per the Zend_Db_Adapter fetch mode.
        */
        public function fetchAll($where = null, $order = null, $count = null, $offset = null)
        {
             /***/
             return new $rowsetClass($data);
        }
    Quand je me trompe, que je suis en tort ou que mes propos manquent de clarté, je m'en excuse publiquement et je rectifie mes dire pour ne pas induire en erreur les personnes qui lisent ce forum et qui y trouvent une aide parfois très précieuse.
    Dans le cas présent, il serait donc bon que tu te corriges et peut-être devrions-nous avoir une discussion en MP pour éviter ce genre d'altercation dans de prochains topics.

    Je commence à trouver lassant de devoir me justifier et citer la doc pour toi, 5h4rk...

Discussions similaires

  1. [XL-2003] Problème avec Find lors d'une éxécution automatique
    Par gentyjp dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/10/2010, 10h05
  2. Problème avec .Find sur la première case
    Par Cipollini dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/07/2010, 15h29
  3. Problème avec .find et findnext
    Par VictoriusDan dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/12/2009, 04h23
  4. Problème avec Find(), Excel Vba
    Par mmmxtina dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 28/05/2009, 11h57
  5. Problème avec "find"
    Par tnarol dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 18/04/2008, 11h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo