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

Langage PHP Discussion :

Formulaire : tester la validité d'un champ


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Par défaut Formulaire : tester la validité d'un champ
    Bonsoir à tous,

    Je dispose d'un formulaire qui me transmet plusieurs valeurs. Je voudrais effectuer des tests sur les valeurs qui me sont transmises. J'effectue donc des tests sur la longueur des champs (if strlen() ==0) ou autres types de tests mais par contre le champ ne devrait pas être valide s'il est uniquement rempli d'espaces.

    Existe-t-il une fonction spécifique en PHP pour tester la validité d'un champ dans ce cas de figure ?

    Merci beaucoup

  2. #2
    Membre très actif
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2011
    Messages : 247
    Par défaut
    Tu peux le faire facilement avec les expressions régulières. Utilise les fonctions de la famille de preg_match().
    Tu auras quelque chose de ce genre (je n'ai pas testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preg_match("#^ *$",$contenu_du_champ);

  3. #3
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonsoir,

    Pour ce genre de test simple, il vaut mieux se passer des regex.
    C'est prendre un marteau pour tuer une mouche.
    Tu as des fonctions natives qui le font 100 fois plus rapidement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
     
    $a = '          ';
    $b = (strlen(trim($a)) === 0);
     
    ?>

  4. #4
    Membre très actif
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2011
    Messages : 247
    Par défaut
    Oh oui largement plus simple

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 351
    Par défaut
    Bonjour,

    Peut-être aussi avec quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if( (strlen($string) == 0) || (strlen($string) == substr_count($string, ' ')) ){
    ...
    }

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Par défaut
    pour moi le plus rapide c'est:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $ct='Mon     avi  ne compte pas ';
    $s=  str_replace(array('  ',' '), array('.','.'),$ct );
    ensuite selon ta version php faire un traitement tableau avec comme separateur le '.' dans ce cas , il y des nouvelles fonctions PHP natives PHP 5, > 1 < 3 qui fonctionnent pour les tableaux

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 420
    Par défaut
    Tu veux faire plusieurs contrôles je te conseille donc de les faire séparément car se sera plus lisible et tu pourras plus facilement modifier ton code.

    Pour supprimer les espaces invisibles en début et fin de chaine (espaces vides, retour ligne...) c'est trim. Pour vérifier la longueur d'une chaine c'est strlen (attention d'utiliser mb_strlen avec utf-8).

    Le plus logique est donc de vérifier que la variable est non vide puis sa longueur

    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
    //vérifie l'existence de la variable $_POST et que la chaine est non vide
    $var = isset($_POST['var']) && trim($_POST['var']) != '' ? $_POST['var'] : null;
     
    // 11 caractères minimum par exemple
    $var = strlen($var) > 10 ? $var : null;
     
    //si la variable a passé les tests
    if(isset($var))
    {
    // traitement php
    }
    else
    {
    /* $_POST['var'] n'est pas défini
    ou
    trim($_POST['var']) == ''
    ou
    strlen($var) <= 10
    */
    }

  8. #8
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Pour compléter la réponse d'ABCIWEB, il faut aussi signaler que trim() n'est pas compatible avec utf-8.
    Donc pour utiliser mb_strlen(), il faut au préalable utiliser mb_trim()... qui n'existe pas

    Voici l'équivalent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /**
     * Supprime les espaces en début et fin de chaine
     * @param string $p
     * @return string
     */
    function mb_trim($p)
    {
       return preg_replace('/^(\s+)|(\s+)$/us', '', $p);
    }

  9. #9
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 420
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Pour compléter la réponse d'ABCIWEB, il faut aussi signaler que trim() n'est pas compatible avec utf-8.
    Heu... si si, "trim" est compatible avec utf-8 dans les conditions standard d'utilisation (sans utilisation du deuxième paramètre optionnel).

    Pour les mêmes raisons que htmlspecialchars d'ailleurs : les caractères traités font partie de la table ASCII 7 qui est codée de manière identique en iso ou en utf-8

    Il y a un topo intéressant ici des fonctions "dangereuses" avec l'utf-8.

  10. #10
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par ABCIWEB Voir le message
    Heu... si si, "trim" est compatible avec utf-8 dans les conditions standard d'utilisation (sans utilisation du deuxième paramètre optionnel).
    Bah, on en apprend tous les jours. Je ne m'étais pas posé plus de question car ma fonction a le même prototype que trim() d'où le réflexe de rester avec preg_ même pour les espaces.
    Allez je l'ai modifiée en conséquence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function mb_trim($p, $chars = null)
    {
       if (null === $chars) {
          return trim($p);
       }
     
       $pqchars = preg_quote($chars);
       $pattern = "/^($pqchars)|($pqchars)\$/us";
       return preg_replace($pattern, '', $p);
    }

  11. #11
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 420
    Par défaut
    Oui enfin cela à un intérêt assez restreint, en cas d'utilisation du deuxième paramètre uniquement, ce qui est somme toute très peu fréquent - d'ailleurs n'avais-tu pas oublié de prendre en considération ce deuxième paramètre dans ta fonction initiale ? preuve que tu ne l'utilisais jamais

    Sinon pour l'usage courant on a tout intérêt à utiliser le "trim" plutôt que de lancer un regex pour si peu

  12. #12
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 351
    Par défaut
    Petite question : pourquoi supprimer les espaces alors qu'on peut tout simplement les compter ? Du coup ça résout les problèmes d'incompatibilité, non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(strlen($string) == substr_count($string, ' ')){
    ...
    }

  13. #13
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 420
    Par défaut
    On supprime les espaces de début et de fin quand ils ne servent à rien pour notre script (ce qui est assez fréquent) et ils peuvent bien souvent être envoyés par une erreur d'étourderie de la part de l'utilisateur lors de la saisie dans un formulaire.

    Cela permet de récupérer les données utiles sur lesquelles ensuite on peut faire des tests si nécessaire.

  14. #14
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 351
    Par défaut
    ah ok je pensais que c'était en rapport avec ce que voulait identifiant_bidon au départ :
    mais par contre le champ ne devrait pas être valide s'il est uniquement rempli d'espaces
    Mais en fait ce sont des tests que tu fais en général et effectivement ça peut être intéressant. Merci.

  15. #15
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 420
    Par défaut
    Citation Envoyé par philodido Voir le message
    ah ok je pensais que c'était en rapport avec ce que voulait identifiant_bidon au départ.
    mais par contre le champ ne devrait pas être valide s'il est uniquement rempli d'espaces
    Bien sûr que c'est en rapport. Dans mon exemple c'est la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //vérifie l'existence de la variable $_POST et que la chaine est non vide
    $var = isset($_POST['var']) && trim($_POST['var']) != '' ? $_POST['var'] : null;
    si trim($_POST['var']) != '' c'est bien que le champ n'est pas rempli uniquement par des espaces...

  16. #16
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 351
    Par défaut
    si trim($_POST['var']) != '' c'est bien que le champ n'est pas rempli uniquement par des espaces...
    C'est bien ce que je disais alors : si il n'y a que des espaces ça les supprime tous pour pouvoir vérifier, non ?

    up : d'accord je crois que je commence à comprendre ce que tu voulais dire c'est que ça vérifie si il n'y a que des espaces et qu'en même temps ça supprime les espace avant après si besoin, ok !

  17. #17
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 420
    Par défaut
    Oui ou en d'autres termes, on supprime tous les espaces de début et de fin de chaine avec : trim($_POST['var']) et on regarde si le reste est différent d'une chaine vide : trim($_POST['var']) != ''

  18. #18
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par ABCIWEB Voir le message
    d'ailleurs n'avais-tu pas oublié de prendre en considération ce deuxième paramètre dans ta fonction initiale ? preuve que tu ne l'utilisais jamais

    Sinon pour l'usage courant on a tout intérêt à utiliser le "trim" plutôt que de lancer un regex pour si peu
    Non je l'avais mis, mais je l'ai (mal) adapté aux espaces. à vrai dire le prototype initial était : function mb_trim($p, $chars = ' '). Bref, boulette
    La version optimale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function mb_trim($p, $chars = null)
    {
       if (mb_strlen($chars) === 0) {
          return trim($p);
       }
     
       $pqchars = preg_quote($chars);
       $pattern = "/^($pqchars)|($pqchars)\$/us";
       return preg_replace($pattern, '', $p);
    }

  19. #19
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 420
    Par défaut
    Et tu t'en es déjà servi de ce deuxième paramètre ? Parce que moi jamais (et puis quand on regarde la doc, on voit vite que son utilisation est assez "coton"...)

  20. #20
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Oui, je m'en suis servi beaucoup à l'époque où les espaces de nom n'étaient pas disponibles pour tout ce qui était préfixé...
    C'est vrai que de nos jours, c'est quand même plus rare.

Discussions similaires

  1. tester l'existence d'un champs de formulaire
    Par ridick dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 14/05/2010, 19h50
  2. Réponses: 9
    Dernier message: 07/05/2009, 19h12
  3. [RegEx] Tester un regex sur un champ de formulaire
    Par Olivier Regnier dans le forum Langage
    Réponses: 1
    Dernier message: 12/11/2007, 00h45
  4. tester la validité des champs d'un formulaire
    Par Maria1505 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/10/2007, 09h07
  5. Tester l'existance d'un champ de formulaire .
    Par maxos75 dans le forum ASP
    Réponses: 3
    Dernier message: 21/12/2005, 13h47

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