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 :

Zend_Form Problème de gestion des erreurs


Sujet :

Zend Framework PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 152
    Par défaut Zend_Form Problème de gestion des erreurs
    Bonjour,

    je travaille toujours sur mon formulaire de recherche et j'ai un problème lors de la construction de la requête permettant de faire la recherche.
    Je m'explique...

    J'ai donc un formulaire de recherche qui contient:
    - une liste de champs (champs de certaines tables de ma base de données)
    - une liste d'opérateurs (par exemple: "est égal", "est différent de"...)
    - un champ input pour saisir une valeur.
    Le formulaire complété permet donc d'obtenir la requête suivante:
    "select * from maTable where". $champ . $operateur .$valeur;

    Le problème c'est que mes champs sont de type "entier" ou "string" ou date"....
    Donc si dans mon champ input je saisi une valeur d'un type différent du type du champ sélectionné dans ma liste, lors de la construction de ma requête, j'obtiens une erreur.
    Un exemple pour être plus clair:
    - je sélectionne dans ma liste des champs "id" qui est de type entier
    - comme opérateur je choisit "est égal"
    - comme valeur j'ai "abc".
    J'obtiens la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from maTable where id='abc'
    Ce qui me renvoie une erreur....

    Quelqu'un aurait-il une idée sur comment gérer ce type d'erreurs ?

    Merci d'avance pour vos réponses.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2009
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2009
    Messages : 126
    Par défaut
    Tu peux faire une première verif en javascript qui éviterait des requêtes inutiles via les regexp.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 152
    Par défaut
    Merci pour ta réponse,

    est-ce que tu pourrais être plus explicite?

    Il faudrait que je crée une fonction javascript qui test si la valeur entrée correspond au type de la variable dans ma base? Mais comment récupérer son type????

    Encore merci pour ton aide mais j'aurai besoin de plus d'éclaircissement

  4. #4
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    La validation javascript n'est qu'une surcouche pour rendre la saisie plus user friendly, mais il ne faut jamais se passer de validation du côté serveur.

    Zend à bien sûr implémenté ceci : http://framework.zend.com/manual/fr/....elements.html chapitre sur les validators.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 152
    Par défaut
    Effectivement, j'ai déjà eu à utiliser ces validators pour d'autres formulaires de saisie.

    Mais dans mon cas ici, je ne vois pas comment récupérer le "type" des champs qu'on peut sélectionner dans ma liste déroulante.
    Je parle bien du type des champs dans ma base ( numeric, text....), car dans ma requête je compare les champs sélectionnés aux valeurs saisies dans le champ INPUT et l'utilisateur peut être amené à saisir pour un champ donné de type 'numeric' une valeur de type 'texte'. Alors lors de l'éxecution de ma requête, une erreur est donc lancée.....

    Comment peut on gérer cela????
    J'ai évidemment pensé aux validateurs mais comment récupérer le type du champ dans ma base??? (je me répète là je crois...)

    Merci

  6. #6
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Si tu utilises Zend_Db_Table_Select et les requêtes préparées, il me semble que le type de données est géré. Au moins au niveau de la différence string/int.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 152
    Par défaut
    Peux-tu être plus précis.

    J'utilise en effet Zend_Db_Table_Select avec des requêtes préparées.
    J'ai l'impression que tu ne comprends pas mon problème ou bien c'est moi qui n'est rien compris, je vais donc essayer de me réexpliquer:

    j'ai un formulaire de recherche de la forme ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    $form = new Zend_Form();
     
    $listeChamps = new  Zend_Form_Element_Select('liste_champs'); // Contient la liste des champs de la table MaTable
    $form->addElement($listeChamps);
     
    $listeOperateurs = new Zend_Form_Element_Select ('liste_operateurs'); // Contient la liste des opérateurs (=, <, >, ...)
    $form->addElement($listeOperateurs);
     
    $value = new Zend_Form_Element_Text('value'); // Va contenir une valeur saisie par l'utilisateur. 
    $form->addElement($value);
    Ainsi, le type de critère de recherche que pourra saisir l'utilisateur ressemble à:
    "monChamp1=test et monChamp4>6 " ...

    Dans mon controleur je construis ma requete à partir des éléments renvoyé par le formulaire en utilisant Zend_Db_Table_Select:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    $sql = $db->select()
                   ->from array('maTable', '*');
     
    switch($this->getElement('liste_operateur')){
      // construction de la clause WHERE $where en fonction de la valeur de l'operateur 
    }
     
    $sql ->where($where);
    Puis la requête est exécutée et le résultat est affiché dans ma vue sous forme d'un tableau.

    Mon problème c'est que dans mon champ 'value' je peux saisir une valeur de type 'text' alors que le champ sélectionné dans la liste des champs doit recevoir une valeur de type 'int'. J'obtiens par exemple la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $sql = "select * from maTable where id='test'"; // alors que id attend une valeur de type 'int'
    Suite à l'exécution de la requête construite j'obtiens donc un message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    An error occurred
    Application error
    Exception information:
     
    Message: SQLSTATE[22P02]: Invalid text representation: 7 ERREUR: syntaxe en entrée invalide pour l'entier : « test »
    Est-ce ainsi que tu avais compris mon problème? Je souhaite trouver le moyen de gérer ce type d'erreurs en affichant un message indiquant par exemple que la requête n'a pu être effectuée...

    Comment faire???

    Merci pour tes réponses et j'espère que l'on va réussir à trouver la solution qui convient!

  8. #8
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Ce que je voudrais connaître, c'est ce qu'il se cache derrière ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      // construction de la clause WHERE $where en fonction de la valeur de

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 152
    Par défaut
    Bonjour,

    voilà comment je construis ma clause WHERE:

    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
     
     
    $nomChamp = $this->getElement('liste_champs')->getValue(); // $this pointant vers mon formulaire
     
    if ($nomChamp != ''){
     
      $operateur = $this->getElement('liste_operateur')->getValue();
      $valeur = $this->getElement('value')->getValue();
     
      switch($operateur){
     
           case "=":
           case "<":
           case ">":
           case "<>":
               $valeur = " ' " . $valeur . " ' "; // je mets des guillemets pour ne pas que j'ai d'erreurs quand j'ai du texte
               break;
     
           case "like":
                $valeur = " '% " . $valeur . " %' ";
                break;
     
          // d'autres case.....
     
         default:
               break;  
     
      }
     
      // Clause WHERE
      $where = $nomChamp . " " . $operateur . " " . $valeur ;
      $sql->where($where);
     
    }
    Merci encore pour ton aide!

  10. #10
    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
    Concrètement, le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $value = new Zend_Form_Element_Text('value');
    Va générer dans ta vue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <input type='text' name='value' />
    Quand tu pousses sur le bouton tu l'envoie dans une action d'un controller.
    A partir de là tu vérifies le contenu de cet Input, avec un validator, voir un filtre

    Dans ton action

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    $recup_value = $this->_request->getParam('value');
     
    $validator = new Zend_Validate_Digits();//vérifie que tu ne dispose que de chiffres 
    if (! $validator->isValid($recup_value){
    .... pas de chiffre alors on revoie le formulaire pour expliquer pourquoi c'est refuser
    }

    On peut aller plus loin, en disant filtrant les données, imagine que j'ai mis un blanc par erreur ou un signe par erreur, et bien d'abord je filtre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $filter = new Zend_Filter_Digits();
     
    $result_value =  $filter->filter($this->_request->getParam('value');
     
    ....suite cfr plus haut
    J'espère que cela va t'aider

  11. #11
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Citation Envoyé par flilou Voir le message
    Bonjour,

    voilà comment je construis ma clause WHERE:

    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
     
     
    $nomChamp = $this->getElement('liste_champs')->getValue(); // $this pointant vers mon formulaire
     
    if ($nomChamp != ''){
     
      $operateur = $this->getElement('liste_operateur')->getValue();
      $valeur = $this->getElement('value')->getValue();
     
      switch($operateur){
     
           case "=":
           case "<":
           case ">":
           case "<>":
               $valeur = " ' " . $valeur . " ' "; // je mets des guillemets pour ne pas que j'ai d'erreurs quand j'ai du texte
               break;
     
           case "like":
                $valeur = " '% " . $valeur . " %' ";
                break;
     
          // d'autres case.....
     
         default:
               break;  
     
      }
     
      // Clause WHERE
      $where = $nomChamp . " " . $operateur . " " . $valeur ;
      $sql->where($where);
     
    }
    Merci encore pour ton aide!
    Tu n'utilises donc pas les atouts des requêtes préparées et paramétrées de PDO.

    Je reviens plus tard si j'ai le temps de t'expliquer comment faire.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 152
    Par défaut
    ok, merci snafu

    j'attends donc ta réponse pour le moment je vais commencer à chercher sur google

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 152
    Par défaut
    Finalement je ne vois pas en quoi ces requêtes préparées pourront m'aider à résoudre mon problème.

    Je ne comprends pas ce à quoi ça sert.

    J'attends donc avec impatience une aide un éclaircissement sur la chose...


    Merci d'avance!

  14. #14
    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
    Pour ce qui est de ta problématique au premier post, je t'ai donner une solution

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 152
    Par défaut
    Merci, j'y ai également pensé mais ça ne peut pas s'appliquer ici.
    D'ailleurs snafu m'avait proposé la même solution dans son premier post.

    Dans mon cas le type de mon champ "value" diffère selon le type du champ sélectionné dans la première liste.
    Pour exemple de champs que je peux trouver dans ma première liste:
    - identifiants de type int => dans "value" je dois saisir un int
    - titre/commentaires.... de type text => dans "value" je dois saisir une chaine de caractères
    - dates => dans "value" je dois saisir une date
    - .....

    Je dois donc appliquer un validateur ('Zend_Validate_Digits' ou 'Zend_Validate_Alpha' ou ...) en fonction du type du champ sélectionné dans la première liste.
    Le problème c'est comment récupérer le type de ce champ????

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 152
    Par défaut
    ça y est il n'y a plus personne,

    aurais-je fais fuir tout le monde avec mon problème?

    Je n'espère pas, je suis toujours dans l'attente d'une réponse qui pourrait m'aider, ca fait longtemps maintenant que je cherche une solution mais rien...

    Merci d'avance.

  17. #17
    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
    on peut voir la liste déroulante, à quoi les valeurs corresponde ?

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 152
    Par défaut
    Les valeurs de ma première liste déroulante correspondent aux noms de mes champs.

    Dans mon formulaire, ils sont intégrées dans ma liste de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $listeChamps = new  Zend_Form_Element_Select('liste_champs'); // Contient la liste des champs de la table MaTable
    $listeChamps->setMultiOptions( array('id', 'date', 'comm',....) ); // Je lui affecte un tableau contenant les noms des champs de ma table.
     
    $form->addElement($listeChamps);
    De même pour ma deuxième liste déroulante, elle contient la liste des opérateurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $listeOperateurs = new Zend_Form_Element_Select ('liste_operateurs'); // Contient la liste des opérateurs (=, <, >, ...)
    $listeOperateurs->setMultiOptions( array('=', '<', '>', ...) );
     
    $form->addElement($listeOperateurs);
    Merci

  19. #19
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Désolé, je suis vraiment surchargé.

    Je pense que tu l'as déjà lu, mais cette page sera ta référence : http://framework.zend.com/manual/fr/zend.db.select.html

    Particulièrement le chapitre "Ajouter une clause WHERE"

    Exemple #17 Exemple d'un paramètre de type tableau pour la méthode where()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        // Construire cette requête :
        //   SELECT produit_id, produit_nom, prix
        //   FROM "produits"
        //   WHERE (prix > 100.00)
     
        $prixminimum = 100;
     
        $select = $db->select()
                     ->from('produits',
                            array('produit_id', 'produit_nom', 'prix'))
                     ->where('prix > ?', $prixminimum);
    Comme tu peux le voir dans cet exemple, le type n'est pas précisé. La requête préparée se chargera de mettre des guillemets si nécessaire.

    Et pour voir tes requêtes, n'oublie pas de lire ceci également :

    http://framework.zend.com/manual/fr/....profiler.html

    en particulier ce passage, très facile à mettre en application avec firefox :

    "Profiler avec Firebug"

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 152
    Par défaut
    Merci pour votre aide...

    Finalement, j'ai procédé autrement: j'ai une table qui contient les attributs de chaque table concernée avec leur type sql.
    J'applique un validateur à mon élément 'value' de mon formulaire, en fonction du type sql de l'attribut sélectionné.

    Voilà!
    Si ça peut aider....

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

Discussions similaires

  1. Problème de gestion des erreurs MySQL
    Par Crygamers dans le forum Langage
    Réponses: 2
    Dernier message: 09/07/2012, 14h50
  2. Problème de gestion des erreurs avec le module RIO
    Par menina_raquel dans le forum Ruby
    Réponses: 0
    Dernier message: 04/01/2011, 17h30
  3. Problèmes gestion des erreurs
    Par <Zer0> dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 01/09/2007, 17h12
  4. Problème de sélection dans un tableau dynamique (gestion des erreurs)
    Par aulilou dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/08/2007, 17h38
  5. Problème sur la gestion des erreurs
    Par ronio dans le forum Langage
    Réponses: 4
    Dernier message: 08/11/2006, 10h47

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