Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework
Zend Framework Forum d'entraide sur la programmation PHP avec Zend Framework. Avant de poster -> FAQ ZF, Cours ZF
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/06/2011, 16h44   #1
Membre régulier
 
Inscription : février 2011
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 114
Points : 77
Points : 77
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 :
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.
flilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2011, 20h31   #2
Membre régulier
 
Homme
Développeur Web
Inscription : octobre 2009
Messages : 72
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Vietnam

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : octobre 2009
Messages : 72
Points : 99
Points : 99
Tu peux faire une première verif en javascript qui éviterait des requêtes inutiles via les regexp.
matlow est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 20/06/2011, 09h24   #3
Membre régulier
 
Inscription : février 2011
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 114
Points : 77
Points : 77
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
flilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 20h57   #4
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
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.
__________________
  • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
  • Merci d'utiliser les balises de code (# dans l'éditeur)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 09h52   #5
Membre régulier
 
Inscription : février 2011
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 114
Points : 77
Points : 77
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
flilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 19h28   #6
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
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.
__________________
  • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
  • Merci d'utiliser les balises de code (# dans l'éditeur)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 16h44   #7
Membre régulier
 
Inscription : février 2011
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 114
Points : 77
Points : 77
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 :
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 :
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 :
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 :
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!
flilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 19h08   #8
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Ce que je voudrais connaître, c'est ce qu'il se cache derrière ceci :
Code :
1
2
 
  // construction de la clause WHERE $where en fonction de la valeur de
__________________
  • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
  • Merci d'utiliser les balises de code (# dans l'éditeur)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 09h34   #9
Membre régulier
 
Inscription : février 2011
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 114
Points : 77
Points : 77
Bonjour,

voilà comment je construis ma clause WHERE:

Code :
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!
flilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 10h03   #10
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 174
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 174
Points : 6 460
Points : 6 460
Concrètement, le code suivant :

Code :
1
2
 
$value = new Zend_Form_Element_Text('value');
Va générer dans ta vue

Code :
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 :
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 :
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
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 10h20   #11
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Citation:
Envoyé par flilou Voir le message
Bonjour,

voilà comment je construis ma clause WHERE:

Code :
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.
__________________
  • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
  • Merci d'utiliser les balises de code (# dans l'éditeur)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 11h10   #12
Membre régulier
 
Inscription : février 2011
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 114
Points : 77
Points : 77
ok, merci snafu

j'attends donc ta réponse pour le moment je vais commencer à chercher sur google
flilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 14h33   #13
Membre régulier
 
Inscription : février 2011
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 114
Points : 77
Points : 77
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!
flilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 14h40   #14
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 174
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 174
Points : 6 460
Points : 6 460
Pour ce qui est de ta problématique au premier post, je t'ai donner une solution
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 15h26   #15
Membre régulier
 
Inscription : février 2011
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 114
Points : 77
Points : 77
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????
flilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 10h56   #16
Membre régulier
 
Inscription : février 2011
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 114
Points : 77
Points : 77
ç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.
flilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 13h54   #17
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 174
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 174
Points : 6 460
Points : 6 460
on peut voir la liste déroulante, à quoi les valeurs corresponde ?
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 17h21   #18
Membre régulier
 
Inscription : février 2011
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 114
Points : 77
Points : 77
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 :
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 :
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
flilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 18h19   #19
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
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 :
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"
__________________
  • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
  • Merci d'utiliser les balises de code (# dans l'éditeur)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 09h25   #20
Membre régulier
 
Inscription : février 2011
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 114
Points : 77
Points : 77
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....
flilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h16.


 
 
 
 
Partenaires

Hébergement Web