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 si la valeur saisie est en entier


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Points : 53
    Points
    53
    Par défaut [Formulaire]Tester si la valeur saisie est en entier
    Bonjour,

    Je cherche à limiter la saisie uniquement aux valeurs entières dans un formulaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <!-- formu.html -->
    <form method="post" action="lireFormu.php">
      Nombre:
      <input type="text" name="nbre" />
      <input type="submit" value="Ok" />
    </form>
    Le script php qui récupère les données du formulaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?php
       // lireFormu.php
       if ( is_numeric ( $_POST['nbre'])) {
          echo "Ok<br />";
          // suite du traitement
       } else {
          echo "Erreur<Ok />";
       }
    ?>
    Si l'utilisateur entre 1.5 j'obtiens Ok et je souhaite obtenir Erreur
    Merci de votre aide

  2. #2
    Rédactrice
    Avatar de xave
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2002
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2002
    Messages : 871
    Points : 1 094
    Points
    1 094
    Par défaut
    Utilises "is_int" au lieu de "is_numeric"

  3. #3
    Membre actif Avatar de hunter
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2004
    Messages : 208
    Points : 216
    Points
    216

  4. #4
    Rédactrice
    Avatar de xave
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2002
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2002
    Messages : 871
    Points : 1 094
    Points
    1 094
    Par défaut
    Citation Envoyé par hunter
    Oui, au moins...

  5. #5
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Faux !
    si vous lisez bien is_int, vous ne pouvez pas tester des données de formulaires avec!!!
    Il faut utilisez is_numeric
    Ensuite pour faire la distinction float/int je propose ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (is_numeric($val) && (int)$val == (float)$val) {

  6. #6
    Rédactrice
    Avatar de xave
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2002
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2002
    Messages : 871
    Points : 1 094
    Points
    1 094
    Par défaut
    Ben j'aurai appris quelque chose alors... Merci Mr N.

  7. #7
    Membre actif Avatar de hunter
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2004
    Messages : 208
    Points : 216
    Points
    216
    Par défaut
    ok ok je savais pas non plus ... on est deux xave

    j'ai fais des petits test j'ai remarqué que les formulaires envois que des chaînes de caractaires ....

    bas j'ai appris quelque chose là

  8. #8
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    On est tous là pour ça

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Points : 53
    Points
    53
    Par défaut
    Effectivement les données récupérées d'un formulaire sont de type chaînes de caractères.

    On est obligé donc d'utiliser is_numeric comme l'indique
    bool is_int ( mixed var )
    Finds whether the given variable is an integer.

    Note: To test if a variable is a number or a numeric string (such as form input, which is always a string), you must use is_numeric().
    Ne vaut-il pas mieux utiliser une expression régulière ?

  10. #10
    Membre actif Avatar de hunter
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2004
    Messages : 208
    Points : 216
    Points
    216
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     is_int((float)$val)
    ça peut pas marcher ?

  11. #11
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    non ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
     
    $val = "45";
     
    var_dump(is_numeric($val) && is_int((float)$val));
    var_dump(is_numeric($val) && (float)$val == (int)$val);
     
    ?>
    donne cela :
    Un float n'est pas un int. Par contre l'inconvénient de ma méthode, est que 45.0000 == 45 or c'est un float. à voir en fonction du besoin si ca pose un problème => regexp

    Les expressions regulières marcheraient, il faut par contre benchmarquer la chose pour savoir ce qui est le plus rapide entre le fait de caster en int puis en float et d'appeler is_numeric vs une regexp...

  12. #12
    Membre actif Avatar de hunter
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2004
    Messages : 208
    Points : 216
    Points
    216
    Par défaut
    alors :
    j'ai rien pour teste la droit sous la main ....

  13. #13
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Sans tester je vois pas pourquoi ca marcherait.

    45.56 est caster en int => 45
    if (45) retourne true (différent de null, 0, '', false)

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Points : 53
    Points
    53
    Par défaut
    FAUX !!

    Comme le montre le bout de code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?php
       $val="123";
       var_dump((float)$val);echo "<br />";
       var_dump(is_int((float)$val));
    ?>

    et ses résultats

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    float(123)
    bool(false)

  15. #15
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Pour les regexp, le cast est apparemment plus rapide :
    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
    <?php
    function microtime_float()
    {
      list($usec, $sec) = explode(" ", microtime());
      return ((float)$usec + (float)$sec);
    }
     
    $val = "45.12";
    $n = 10000;
     
    $somme = 0;
    for ($i = 0 ; $i < $n ; $i++) {
        $start = microtime_float();
        is_numeric($val) && (float)$val == (int)$val;
        $somme += microtime_float() - $start;
    }
     
    var_dump($somme/$n);
     
    $somme = 0;
    for ($i = 0 ; $i < $n ; $i++) {
        $start = microtime_float();
        is_numeric($val) && preg_match('/\./', $val) == 0;
        $somme += microtime_float() - $start;
    }
     
    var_dump($somme/$n);
     
    ?>
    me donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float(1.1571621894836E-5) float(1.4062857627869E-5)
    Donc le cast met en moyenne 0.0116 millisecondes alors que le preg met en moyenne 0.0141 millisecondes. Ca reste minime comme différence

    EDIT il y a peut-etre d'autres façons d'ecrire la regexp, je suis pas très fort là dessus.

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Points : 53
    Points
    53
    Par défaut
    On peut aussi écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?php
      $val=$_POST['nbre'];
      var_dump($val);echo "<br />";
      if ( is_numeric($val) && $val==(int)$val){
         echo "Ok<br/>";
      }else{
         echo "Erreur<br/>";
      }
    ?>

  17. #17
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    +1

    On gagne entre 0.2 et 0.5 microsecondes

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Points : 53
    Points
    53
    Par défaut [Test formulaire]Tester si la valeur saisie est en entier
    Pour apporter un élément de réponse, voici un programme p1.php
    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
     
    <?php
      $val="123";
      var_dump(is_int($val));
      var_dump(is_numeric($val) && $val==(int)$val);
      var_dump(preg_match("/^(\+|-)?[0-9]+$/",$val));
     
      $val="-123";
      var_dump(is_int($val));
      var_dump(is_numeric($val) && $val==(int)$val);
      var_dump(preg_match("/^(\+|-)?[0-9]+$/",$val));
     
      $val="123.0";
      var_dump(is_int($val));
      var_dump(is_numeric($val) &&  $val==(int)$val);
      var_dump(preg_match("/^(\+|-)?[0-9]+$/",$val));
     
      $val="  123"; // des espaces avant
      var_dump(is_int($val));
      var_dump(is_numeric($val) && $val==(int)$val);
      var_dump(preg_match("/^(\+|-)?[0-9]+$/",$val));
     
      $val="123  "; // des espaces après
      var_dump(is_int($val));
      var_dump(is_numeric($val) && $val==(int)$val);
      var_dump(preg_match("/^(\+|-)?[0-9]+$/",$val));
    ?>
    et ses résultats obtenus avec la ligne de commande php t1.php
    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
     
    bool(false)
    bool(true)
    int(1)
    bool(false)
    bool(true)
    int(1)
    bool(false)
    bool(true)
    int(0)
    bool(false)
    bool(true)
    int(0)
    bool(false)
    bool(false)
    int(0)
    Apparemment la fonction is_numeric accepte des espaces avant mais pas après

  19. #19
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    intéressant comme test !
    Donc il faudrait faire un trim auparavent...

Discussions similaires

  1. Tester si valeur saisie est une chaîne de caractère
    Par mtxmotorax dans le forum Débuter
    Réponses: 9
    Dernier message: 03/03/2011, 10h25
  2. tester si la valeur introduite est un entier
    Par ouardia dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 13/07/2007, 08h33
  3. Comment vérifier que la valeur saisie est de type numérique ?
    Par prince_antonio dans le forum ASP.NET
    Réponses: 16
    Dernier message: 20/07/2006, 12h57
  4. Réponses: 3
    Dernier message: 07/10/2005, 09h34
  5. [VB.NET] [VS.NET] Tester si le texte saisi est un entier
    Par San Soussy dans le forum Windows Forms
    Réponses: 2
    Dernier message: 19/10/2004, 10h41

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