Page 1 sur 2
verification qu'une variable est bien un nombre entier
Posté : 05 nov. 2007, 21:18
par BeRoots
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
$bar = '1';
$foo = is_int($bar);
echo $foo;
le echo du resultat de is_int ne me retourne rien
si quelqu'un à une idée sur le pourquoi?
merci d'avance

Posté : 05 nov. 2007, 21:56
par Hywan
Et si tu le transtype en entier ? Tu protèges, et c'est bon. Le type avait qu'à faire gaffe ^^.
Posté : 05 nov. 2007, 22:15
par momox
is_int renvoie un booléen non ?
Si tu fais echo gettype(is_int($bar)); tu devrais avoir une réponse

Posté : 05 nov. 2007, 22:21
par Truc
<Hors sujet>
BeRoots ceci n'est pas un forum de rencontre
"Contacter moi par MP" et plus si affinité ? (Cf ta signature)
</Hors sujet>
Posté : 05 nov. 2007, 22:41
par AB
Posté : 06 nov. 2007, 00:13
par BeRoots
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
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’injection à l’url détecté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
"Contacter moi par MP" et plus si affinité ? (Cf ta signature)
</Hors sujet>
Un Rencard

Posté : 06 nov. 2007, 00:21
par h0_noMan
<?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’injection à l’url détectée !</p>
<?php
exit() ;
}?>
Il est plus facile de definir (dans ce cas) les conditions du traitement que les conditions d'affichage d'erreur.
Posté : 06 nov. 2007, 00:47
par AB
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'])
Posté : 06 nov. 2007, 01:04
par Victor BRITO
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
}
Posté : 06 nov. 2007, 01:07
par Hywan
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 ...
Posté : 06 nov. 2007, 01:16
par AB
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

Posté : 06 nov. 2007, 01:22
par h0_noMan
On peut aller encore plus loin.
Si tu ne veux que les entiers positif de 0 a x
Tu rajoute un $nombre%(x+1)
$x = 9 ; // Ton numero maximum de page
$nombre = (isset($_GET['nombre']) && is_numeric($_GET['nombre']))? abs(intval($_GET['nombre']))%($x+1): 0;
Posté : 06 nov. 2007, 01:30
par AB
Ben si avec tout ça il a pas assez de choix
Mais je crois qu'il s'en fout maintenant... depuis qu'il a eu son rencard avec Truc

Posté : 06 nov. 2007, 22:02
par Truc
Mais je crois qu'il s'en fout maintenant... depuis qu'il a eu son rencard avec Truc

Euh...

Posté : 06 nov. 2007, 23:10
par Hubert Roksor
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)));