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 :

champ numerique et !is_numeric [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut champ numerique et !is_numeric
    Salam ; j'ai un formulaire avec des champs numériques positives (0,1....).
    je contrôle ces champs en php avec is_numeric ( valeurs venant d'un champ texte) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ........................
    if ((empty($_POST['m'])) or (!is_numeric($_POST['m'])))
    	{
    	$erreurs_msg['m'] = 'Veuillez saisir un nombre dans la case M:00-01 SVP.';
    }
    si je saisie : 0 j'ai le message d'erreur, normalement sa passe.
    si je saisie: 00 sa passe c'est bon résultat dans la bdd champ=0.
    si je saisie: 1,2 sa passe pas.
    si je saisie: 1.2 sa passe résultat dans la bdd champ=1 le (.2) est ignoré.
    si je saisie: -2 sa passe résultat dans la bdd champ=0 .
    is_int() sa ne marche pas !!!

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    le 1,2 c'est normale, ensuite ça depend surtout ce que tu fait au moment ta requête et de ton type champs

  3. #3
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    Re , type de champ est mediumint.
    dans la requête d'insertion je ne fait aucun contrôle ni conversion.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    .........
    $insertdata->bindParam(':m',	$_POST['m'],  PDO::PARAM_INT); // entier
    ............
    je veux inséré que les les chiffres supérieurs a zéro.

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    fait un filter_var

    ps : juste 'm' pas besoin de faire ':m'

  5. #5
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Le comportement que tu as est normal, c'est propre à la fonction_is_numeric().
    Consulte la doc : is_numeric()

    Il faut savoir que tous les paramètres récupérées dans $_GET ou $_POST sont considérés comme des chaines, et c'est pour cela qu'il existe cette fonction is_numeric().
    Une chaine comme "33" sera considéré comme un nombre (33).

    Après, ça dépend qu'est-ce que tu veut en faire.
    Faire des vérifications/filtres est souvent indispensable afin d'éviter d'enregistrer n'importe quoi dans la Bdd.
    Tout ceci peu donner lieu à de gros paquets de codes.

    Pour le 2,2, ça dépend des configurations de php, des locales, fonction setlocale().
    On peu par exemple définir la virgule comme séparateur décimale, mais personnellement je m'y suis jamais risqué.
    Le point est plus universel à mon sens.

    De ton coté tu peux toujours remplacer le virgule par un point pour accepter le nombre pour qu'après insérer un nombre décimal (pour exemple).

    je veux inséré que les les chiffres supérieurs a zéro.
    Alors au niveau de la verif on peut faire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (isset($_POST['m']) && (int)$_POST['m'] > 0) {
        $entier = (int)$_POST['m'];
    }
    En somme, on caste la données, et ici elle sera obligatoirement >= à 1

  6. #6
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    Re, merci RunCodePhp.

    pour ta proposition sa marche mais les chiffres décimaux passent , je dois accepté que les entiers naturels exemple (12,21,3,0......) pas des 12.3 ou 45.66....
    code vérification:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if (isset($_POST['validform'])) // si le formulaire est validé
    {
    ....
    if ((empty($_POST['m'])) or (int)$_POST['m'] <0) //
    {
    $erreurs_msg['m'] = 'Veuillez saisir un nombre dans la case M:00-01 SVP.';
    } 
    ....
    }

  7. #7
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    pour ta proposition sa marche mais les chiffres décimaux passent
    Oui, c'est vrai qu'au niveau de l'alternative ça passe, et c'est après que ça caste la variable.

    Si tu veux vraiment filtrer les données de manière assez stricte, alors comme l'a dit stealth35 utilise filter_var().

    Normalement ceci devrait retourner FALSE pour un nombre décimal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (isset($_POST['m']) && filter_var($_POST['m'], FILTER_VALIDATE_INT)) ...

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    même faire direct un filter_input

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(filter_input(INPUT_POST, 'm', FILTER_VALIDATE_INT))

  9. #9
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    voila le code j'ai utilisé avec flter_var:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    if ( filter_var($_POST['datedec'], FILTER_VALIDATE_INT) == false) //
    {
     
    echo 'Veuillez saisir un nombre naturel (N) SVP.';
    }
    sa marche avec tous les nombre >0 , le 0 et le 00 il ne passe pas !!!!! et j'ai besoin de cet valeur.

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    ... c'est === pas ==

    et utilise filter_input

  11. #11
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    sa marche avec tous les nombre >0 , le 0 et le 00 il ne passe pas !!!!! et j'ai besoin de cet valeur.
    Ce n'est pas logique.
    Si on n'accepte pas 0, j'ai du mal à concevoir que 00 (ou 000, ou 0000, etc ...) serait un entier supérieur à 1.

    Mise à part, fait un OU :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (filter_var($_POST['datedec'], FILTER_VALIDATE_INT) || $_POST['datedec'] === '00') {
        // Valeur valide
    }
    else {
        // ERREUR
    }
    Et si l'utilisateur saisie 000 ou 0000, tu fais comment ?

  12. #12
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    dans le même sens je suis arrivé a ce contrôle avec le code ci-dessous , il accepte le zéro et non pas le 00 ( considéré comme chaine de caractère) parce que j'ai pas utilisé is_numeric.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ....
    $var = filter_input(INPUT_POST, 'var', FILTER_VALIDATE_INT);
    if ( is_null($var) or $var=== false) 
     
    {
     
    echo 'Veuillez saisir un nombre dans la case M:00-01 SVP.';
    } 
     
    .....
    sa marche impeccablement , s'il y'a un teste qui m'echape je suis preneur.
    merci RunCodePhp : le sauveur de Rome
    merci stealth35

  13. #13
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    Salam , et voila de retour , le code ci-dessous les -1 ou -50 sa passe comme les + 1 , +99.....

  14. #14
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Citation Envoyé par redoran Voir le message
    Salam , et voila de retour , le code ci-dessous les -1 ou -50 sa passe comme les + 1 , +99.....
    Je viens d'essayer, comme ceci ça ne passe pas : (genre "+99")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (filter_var($nombre, FILTER_VALIDATE_INT) === TRUE && (int)$nombre > 0)
    Ceci dit, ne pas accepter +99 est-ce logique ?
    saisir +99 ou 99, c'est pareil non ? Faut il considérer ça comme une erreur de saisie ?

    Ne faudrait il pas faire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $var = filter_input(INPUT_POST, 'var', FILTER_VALIDATE_INT);
    if ($var && (int)$var > 0)

    S'il existe un flitre (natif) pour un entier strictement positif, je ne suis pas au courant.

  15. #15
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par RunCodePhp Voir le message
    S'il existe un flitre (natif) pour un entier strictement positif, je ne suis pas au courant.
    tu mets le min_range a 0

  16. #16
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    Re ; RunCodePhp:
    saisir +99 ou 99, c'est pareil non ? Faut il considérer ça comme une erreur de saisie ?
    ta raison se n'est pas une erreur de saisie , le +99 est enregistré dans la BDD 99
    S'il existe un flitre (natif) pour un entier strictement positif, je ne suis pas au courant
    d'après la doc que j'ai eu y' a pas sauf erreur de ma part.
    la piste de stealth36
    tu mets le min_range a 0
    donne 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
     
    ..........
    $var=$_POST['m'];
    $int_options = array("options"=>array("min_range"=>0, "max_range"=>999));
     
    $m =filter_var($var, FILTER_VALIDATE_INT, $int_options);
     
    	if ( is_null($m) or $m=== false) 
     
    	{
     
    	echo 'Veuillez saisir un nombre valide SVP.';
    	} 
    }
     
    .........
    le nombre maximum est de 999 , parce que j'ai limité mon input a 3 caractéres ce qui donne un maximum de 999 , la case concerné ne peut dépassé sur le terrain 999 unités.
    donc je dois écrire ce contrôle 16 fois ( nombre de variables) est ce que si possible de le faire sous forme de fonction? si oui est ce que quelqu'un peut m'aidé ? merci

  17. #17
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    suffit de faire une boucle ...

    pourquoi t’utilises pas filter_input ?

  18. #18
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    Stealth36
    pourquoi t’utilises pas filter_input ?
    sa laisse passé les -1, -12...... (les nombres négatifs) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ....
    $var=$_POST['datedec'];
     
    $datedec = filter_input(INPUT_POST, 'datedec', FILTER_VALIDATE_INT);
    if ( is_null($datedec) or $datedec=== false)  
    {
     
    echo 'Veuillez saisir un nombre dans la case M:00-01 SVP.';
    } 
    .......

  19. #19
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    sa laisse passé les -1, -12...... (les nombres négatifs)
    Tu en est sûr ?
    Tu t'es pas mélangé les pineaux dans les différents test ?

    Je viens d'essayer, le comportement de filter_var et filter_input est le même, les 2 fonctions acceptent "-12".
    Ca me parais plutôt normal, l'inverse serait étonnant.

    Mais on s'en fiche un peu, car les options règlent le problème (min_range).


    Il y a tout de même une différence entre ces 2 fonctions.
    filter_var() retourne uniquement FALSE en cas d'erreur.
    Par contre, filter_input() retourne FALSE en cas d'erreur, mais retourne NULL si l'élément n'est pas défini.

    Vu ton alternative, tu accepterais la donnée dans le cas où elle n'existerait pas (par défaut ce serait 0).
    C'est bizarre quand même.
    D'un coté tu est très stricte, de l'autre assez permissif.
    Mais pourquoi pas.


    Citation Envoyé par stealth35
    tu mets le min_range a 0
    C'est dommage que les CMS, et même les FW ne les utilisent pas, c'est en bonne partie là que j'apprends les choses.
    Mais ici aussi.

    Merci

  20. #20
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    re; Run :
    Tu t'es pas mélangé les pineaux dans les différents test ?
    ta qu' testé le code ci dessus résultat sa laisse passé les -1 et -20.... et sont enregistrés dans la bdd sous de forme de zero (0).
    Je viens d'essayer, le comportement de filter_var et filter_input est le même, les 2 fonctions acceptent "-12".
    c'est surtout ça que je ne veut pas
    Vu ton alternative, tu accepterais la donnée dans le cas où elle n'existerait pas (par défaut ce serait 0).
    oui le zero dans le champ veut dire dans mon cas que l'utilisateur est passé le champ concerné et a saisie une donnée qui est 0 , et veut dire aussi que se n'est pas un oubli de saisie de champ.
    est ce que c'est possible d'englobé ce test dans une fonction , j'ai commencé comme suite mais j'arrive pas a terminé la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    .....
    function verif_numpos ($varnum)
    	{
    $int_options = array("options"=>array("min_range"=>0, "max_range"=>256));
    $varnum =filter_var($varnum, FILTER_VALIDATE_INT, $int_options);
     
    			}

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. definir le nbre de chiffre d'un champ numerique
    Par Renardo dans le forum Access
    Réponses: 1
    Dernier message: 22/08/2006, 00h28
  2. Modifier un champ numerique en num auto
    Par Azerty2 dans le forum Access
    Réponses: 16
    Dernier message: 18/07/2006, 22h35
  3. Champ numerique dans table liée
    Par ob1knob dans le forum Access
    Réponses: 1
    Dernier message: 06/07/2006, 16h53
  4. probleme avec des champs numeriques
    Par el_quincho dans le forum Access
    Réponses: 1
    Dernier message: 16/03/2006, 11h55
  5. Increment d'un champ numerique
    Par oazar dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/04/2004, 23h28

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