verification qu'une variable est bien un nombre entier

Mammouth du PHP | 843 Messages

05 nov. 2007, 21:18

salut à tous :)

un truc tous bête qui me bloque :?
je cherche à verifier si une variable est un entier pour controle de validiter de celle-ci :-k
$bar = '1';
$foo = is_int($bar);

echo $foo;
le echo du resultat de is_int ne me retourne rien :-k

si quelqu'un à une idée sur le pourquoi?
merci d'avance :)
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

ViPHP
ViPHP | 4674 Messages

05 nov. 2007, 21:56

Et si tu le transtype en entier ? Tu protèges, et c'est bon. Le type avait qu'à faire gaffe ^^.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Mammouth du PHP | 1511 Messages

05 nov. 2007, 22:15

is_int renvoie un booléen non ?
Si tu fais echo gettype(is_int($bar)); tu devrais avoir une réponse ;)

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

05 nov. 2007, 22:21

<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>

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

ViPHP
AB
ViPHP | 5818 Messages

05 nov. 2007, 22:41


Mammouth du PHP | 843 Messages

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:
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Eléphant du PHP | 445 Messages

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.

ViPHP
AB
ViPHP | 5818 Messages

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'])

Mammouth du PHP | 2937 Messages

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
}

ViPHP
ViPHP | 4674 Messages

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 ...
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
AB
ViPHP | 5818 Messages

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 :)

Eléphant du PHP | 445 Messages

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; 

ViPHP
AB
ViPHP | 5818 Messages

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:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

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:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

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)));