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_Db PHP Discussion :

->bind absent de la version 1.7 ? [ZF 1.7]


Sujet :

Zend_Db PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut ->bind absent de la version 1.7 ?
    Bonjour,
    Dans la doc de Zend Framework, je trouve ce petit bout de code pour faire les requêtes proprement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1. $rows = $table->fetchAll(
    2. $table->select()
    3. ->where('bug_status = :status')
    4. ->bind(array(':status'=>'NEW')
    5. ->order('bug_id ASC')
    6. ->limit(10, 0)
    7. );
    J'essaie avec mon appli :
    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
    // Recherche de la personne saisie
                        $personne = new Personne();
                        $select = $personne ->select();
                        $select    ->setIntegrityCheck(false)
                                ->from(array('p' => 'T_Personne_PRS'), 'COUNT(*)');
     
                        $where = 'p.PRS_Nom = :nom AND p.PRS_Prenom = :prenom ';
     
                        if ($service_emetteur != '0')
                        {
                            // L'émetteur a choisi son service dans la liste déroulante
                            $service = intval($service_emetteur);
                            $where .= 'AND p.PRS_Id_Service = :service ';
                        }
                        else
                        {
                            // L'émetteur a saisi le nom de son service
                            $select->join(array('s' => 'T_Service_SRV'), 
                                            's.SRV_Id = p.PRS_Id_Service ', 
                                            array()
                                        );
                            $service = $form->getValue('service');
                            $where .= 'AND s.SRV_Nom = :service ';
                        } // Fin du else de if ($service_emetteur != '0')
     
                        $select    ->where($where)
                                ->bind (array(    ':nom' => $nom_emetteur,
                                        ':prenom' => $prenom_emetteur,
                                        ':service' => $service)
                                        );
                        $sql = $select->__toString();
                        echo $sql;
     
                        echo 'nom : '.$nom_emetteur;
                        echo '<br />prénom : '.$prenom_emetteur;
                        echo '<br />service : '.$service;
                        exit;
    Le méchant Zend me répond :
    Fatal error: Uncaught exception 'Zend_Db_Select_Exception' with message 'Unrecognized method 'bind()'' in /usr/share/php/Zend/Db/Select.php
    J'ai un peu cherché dans les programmes de Zend_Db mais je n'ai effectivement pas trouvé de fonction appelée strictement "bind".

    C'est apparu après la version 1.7 ou c'est moi qui l'utilise mal ?

    Si ce n'est pas dispo, comment faire ça proprement en version 1.7 ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Effectivement dans la version 1.7.7, il n'y a pas non plus de méthode bind.

    Alors soit tu crées une nouvelle classe qui étend Zend_Db_Select() et tu crées la méthode bind

    soit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    ->where('bug_status = :status',array(':status'=>'NEW'))

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    soit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    ->where('bug_status = :status',array(':status'=>'NEW'))
    Le problème c'est que mon where est défini préalablement dans une variable texte et peut comporter plus ou moins de paramètres selon les cas, comme c'est décrit dans mon code plus haut.

    Du coup ça m'oblige en parallèle à définir un tableau de paramètres à passer à la méthode ->where.

    Comme j'étais pressé, j'ai fait ça à l'arrache en mettant les variables de paramètre directement dans le where.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Je ne comprend pas, tu montres ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     $select    ->where($where)
                                ->bind (array(    ':nom' => $nom_emetteur,
                                        ':prenom' => $prenom_emetteur,
                                        ':service' => $service)
                                        );
    cela peut-être remplacer par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     $select    ->where($where,array(    ':nom' => $nom_emetteur,
                                        ':prenom' => $prenom_emetteur,
                                        ':service' => $service)
                                        );
    Dans le PDO ce que je préfère, c'est qu'on peut mettre des '?' a la place des ':nom' par exemple, ce qui dans ton cas pourrais être bénéfique.

    Et puis rien ne t'empêche de créer un véritable query

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    Je ne comprend pas, tu montres ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     $select    ->where($where)
                                ->bind (array(    ':nom' => $nom_emetteur,
                                        ':prenom' => $prenom_emetteur,
                                        ':service' => $service)
                                        );
    Je montre aussi ceci :
    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
    $where = 'p.PRS_Nom = :nom AND p.PRS_Prenom = :prenom ';
     
                        if ($service_emetteur != '0')
                        {
                            // L'émetteur a choisi son service dans la liste déroulante
                            $service = intval($service_emetteur);
                            $where .= 'AND p.PRS_Id_Service = :service ';
                        }
                        else
                        {
                            // L'émetteur a saisi le nom de son service
                            $select->join(array('s' => 'T_Service_SRV'), 
                                            's.SRV_Id = p.PRS_Id_Service ', 
                                            array()
                                        );
                            $service = $form->getValue('service');
                            $where .= 'AND s.SRV_Nom = :service ';
                        } // Fin du else de if ($service_emetteur != '0')
    Je ne sais pas a priori combien mon where va comprendre de paramètres. Il faudrait donc que je construise en parallèle du $where un $param_where[] à transmettre à la méthode ->where.

    C'est un peu chiant mais pas infaisable non plus.

    C'est vrai que je suis plutôt dérouté de ne pas voir mes belles requêtes SQL en clair dans mon code Zend.

    Je m'y habituerai mais on voit que Zend est un truc fait pour ceux qui ne maîtrisent pas trop le SQL. Ca peut inciter à faire des requêtes pas optimisées cette abstraction !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Perso, je ne fait confiance à Zend que pour de tout petit select, le reste je le fait en dur, c'est beaucoup plus facile et clair, il y a quand même peu de chance que tu changes de db donc .....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Je cherche une version du binding OpenALAda
    Par Invité dans le forum Ada
    Réponses: 2
    Dernier message: 28/09/2009, 09h13
  2. [Kylix] cours & version utilisable de Kylix
    Par Suricate dans le forum EDI
    Réponses: 1
    Dernier message: 19/09/2002, 18h22
  3. Version étudiant de Delphi 6
    Par Smortex dans le forum EDI
    Réponses: 2
    Dernier message: 20/07/2002, 11h13

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