verification qu'une variable est bien un nombre entier

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : verification qu'une variable est bien un nombre entier

par Hubert Roksor » 08 nov. 2007, 23:17

Attention, ctype_digit() ne fera probablement pas partie de PHP6... si j'étais toi j'utiliserais plutôt filter_input()/filter_var() (plus un if pour vérifier que le nombre est positif) ou encore preg_match().

par BeRoots » 08 nov. 2007, 22:38

Merci à tous pour pour vos réponses :pouce:

j'ai opté pour ctype_digit() qui est dans mon cas le meilleur rapport légerté/optimisation ;)

PS. pour ce qui est du RDV avec TRUC, j'ai pas osé... :oops: je suis un grand timide :lol:

par AB » 07 nov. 2007, 03:12

Puisqu'on est dans les bench, j'avais comparé les preg, ereg avec l'utilisation d'une ou plusieurs fonctions simples ... et des résultats parfois surprenants.
http://www.phpfrance.com/forums/voir_re ... php#211495

par Sékiltoyai » 07 nov. 2007, 03:03

Non, preg_match() c'est pas méga performant. C'est plus performant que ereg mais il ne faut pas oublier que dans le preg_match() il y a toute la partie traduction de la pcre alors que dans un is_numeric() et dans les autres fonctions, le masque est codé en dur, c'est normal que preg_match() prenne autant de temps…

par Hywan » 07 nov. 2007, 01:09

Merci Hubert pour ce test :).
Je ne connaissais pas la fonction strspn().

Au final, is_numeric() ressort grand gagnant. Je pensais que preg_match serait un peu plus rapide tout même ...

Encore merci pour le test, je le garde de côté ;-).

par Hubert Roksor » 06 nov. 2007, 23:10

Je serais curieux de savoir ce qui est le plus rapide
De tête, je dirais is_numeric() (qui ne s'applique pas ici), ctype_digit(), strspn(), preg_match(), toute autre solution.

À mon avis, la meilleure méthode serait d'utiliser filter_input(). Sinon, preg_match('#^[0-9]+$#D')... n'oubliez pas le D final siouplé.

PS: hmm, je dois avoir bonne mémoire. Sous PHP 5.2.4 et sur 1 000 000 itérations, ce qui signifie que le nombre à gauche et la durée (approximative) de l'opération en microsecondes :

Code : Tout sélectionner

0.6759 is_numeric($var); 0.7418 ctype_digit($var); 1.8111 !isset($var[strspn($var, '1234567890')]); 2.8665 strspn($var, '1234567890') === strlen($var); 3.4812 preg_match('#^[0-9]+$#D', $var); 1.9168 filter_var($var, FILTER_VALIDATE_INT); 1.9986 filter_var($var, FILTER_VALIDATE_INT) >= 0; 3.8433 filter_var($var, FILTER_VALIDATE_INT, array('options'=>array('min_range' => 0)));

par Truc » 06 nov. 2007, 22:02

Mais je crois qu'il s'en fout maintenant... depuis qu'il a eu son rencard avec Truc :love7:
Euh... :non:

par AB » 06 nov. 2007, 01:30

Ben si avec tout ça il a pas assez de choix :tir2:

Mais je crois qu'il s'en fout maintenant... depuis qu'il a eu son rencard avec Truc :love7:

par h0_noMan » 06 nov. 2007, 01:22

On peut aller encore plus loin.

Si tu ne veux que les entiers positif de 0 a x
Tu rajoute un $nombre%(x+1) :lol:
$x = 9 ; // Ton numero maximum de page
$nombre = (isset($_GET['nombre']) && is_numeric($_GET['nombre']))? abs(intval($_GET['nombre']))%($x+1): 0; 

par AB » 06 nov. 2007, 01:16

Je serais curieux de savoir ce qui est le plus rapide ...
Quelqu'un de motivé pour faire le test ? (sinon je le fais) Àmha, l'expression est plus lente, mais j'ai un doute tout de même ...
Oui moi aussi. Dans ce cas particulier, je miserais pas un million de dollars sur ma monture :)

par Hywan » 06 nov. 2007, 01:07

Je serais curieux de savoir ce qui est le plus rapide ...
Quelqu'un de motivé pour faire le test ? (sinon je le fais) Àmha, l'expression est plus lente, mais j'ai un doute tout de même ...

par Victor BRITO » 06 nov. 2007, 01:04

Autre solution : recourir aux expressions régulières.
if (isset ($_GET['page']) && preg_match ("/^[0-9]+$/", $_GET['page']))
{
  // C'est bien ce qu'on attend
}
else
{
  // PHPFrance, on met à l'épreuve mon application
}

par AB » 06 nov. 2007, 00:47

merci pour vos réponse :)
...
mon problème est que pour des valeur de $_GET['page'] tel que 0,1,2... (donc des entier), je rentre quand même dans ma boucle :?

j'ai essaye de rempace !is_int($_GET['page']) par is_int($_GET['page']) == false mais rien de mieux :(
...
Bah t'as du lire un peu trop vite mon précédent message :
Note: Pour tester si une variable est un nombre ou une chaîne numérique (comme les entrées de formulaire, qui sont toujours des chaînes), vous devez utiliser la fonction is_numeric().
...
Si l'on s'attend à récupérer un entier, on peut faire
$nombre = (isset($_POST['nombre']) && is_numeric($_POST['nombre']))? intval($_POST['nombre']) : 0;
Il te suffisait de transposer et faire
$nombre = (isset($_GET['nombre']) && is_numeric($_GET['nombre']))? abs(intval($_GET['nombre'])) : 0;
pour être sûr d'obtenir un entier positif ou égal à 0
Il est plus facile de definir (dans ce cas) les conditions du traitement que les conditions d'affichage d'erreur.
EDIT
mais si tu souhaites néanmoins savoir si la valeur envoyée était un nombre entier positif rien ne t'empêche de faire ensuite
if (isset($_GET['nombre']) && $_GET['nombre'] == $nombre)...
Toujours est-il qu'il ne faut pas faire is_int($GET['quelquechose'])

par h0_noMan » 06 nov. 2007, 00:21

<?php
if(isset($_GET['page']) && is_numeric($_GET['page']))
{
// Traitement
$page = $_GET['page'] ;

   switch($page)
   {
     case 0:
       // Action a effectuer pour page=0
       break;
     case 1:
       // Action a effectuer pour page=1
       break;
     case 2:
       // Action a effectuer pour page=2
       break;
   // Et ainsi de suite
   }

}else{
?>
<h3 class="error">ALERTE DE SECURITE:</h3>
<p class="error">Tentative d&rsquo;injection &agrave; l&rsquo;url d&eacute;tect&eacute;e !</p>
<?php
exit() ;
}?>
Il est plus facile de definir (dans ce cas) les conditions du traitement que les conditions d'affichage d'erreur.

par BeRoots » 06 nov. 2007, 00:13

merci pour vos réponse :)

moi ce que je cherche à faire c'est de verifier la validité d'un parametre $_GET['page'] comme un nombre entier positif :-k

en gros voici ma façon de faire:
// Si le paramètre $_GET differe de sa valeur definie, controle de securité.
if(isset($_GET['page']) && !is_int($_GET['page']))
{
?>
             <h3 class="error">ALERTE DE SECURITE:</h3>
            <p class="error">Tentative d&rsquo;injection &agrave; l&rsquo;url d&eacute;tect&eacute;e !</p>
 <?php
   exit;
}
else
{
   // sinon on continue le traitement du script
}
mon problème est que pour des valeur de $_GET['page'] tel que 0,1,2... (donc des entier), je rentre quand même dans ma boucle :?

j'ai essaye de rempace !is_int($_GET['page']) par is_int($_GET['page']) == false mais rien de mieux :(


si quelqu'un à une idée sur une methode pour s'assurer de la validiter du paramètre page passer à GET?

merci d'avance :)
<Hors sujet>
BeRoots ceci n'est pas un forum de rencontre :lol:

"Contacter moi par MP" et plus si affinité ? (Cf ta signature)
</Hors sujet>
Un Rencard :lol: