7
votes

is_int () ne peut pas vérifier $ _GET dans php?

Voici mon code:

<?php
$id = $_GET["id"];

if (is_int($id) === FALSE)  {
    header('HTTP/1.1 404 Not Found');
    exit('404, page not found');
    }
?>


1 commentaires

Et $ _ obtenez contient en fait ... Quoi?


7 Réponses :


33
votes

is_int code> vérifie que le type Type de données em> est un entier, mais tout dans $ _ get code> sera une chaîne . em > Par conséquent, il retournera toujours faux code>.

dans une pincée, vous pouvez lancer dans un entier, puis vérifier! = 0. p>

$id = isset($_GET['id']) ? (int) $_GET['id'] : null;

if (!$id) { // === 0 || === null
  header('HTTP/1.1 404 Not Found');
  exit('404, page not found');
}


3 commentaires

A manqué de upvotes pour la journée, mais cette réponse dit en fait la raison pour laquelle utiliser IS_Numeric. Tout paramètre de requête HTTP envoyé par courrier ou obtenir sera toujours une chaîne.


+1 - cependant à mentionner, is_numeric n'a pas le même effet, tel que par exemple. laisse également passer des valeurs heex à part les autres (voir php.net)


@Helmut, oui, is_numeric () n'est pas correct pour la vérification des identifiants entier. En pratique, toutes les entrées de l'utilisateur doivent être transmises via filtre_var () ou une autre routine explicite de la même manière.



5
votes

Entrée de l'utilisateur en $ _GET TRAMA (ainsi que les autres superglobaux) prennent la forme de chaînes.

is_int vérifie le type type (ie String ) de la valeur, non si elle contient des valeurs d'entier. Pour vérification que l'entrée est une chaîne entière, je suggérerais quelque chose comme ctype_digit ou Un entier filtre ( filtre_validate_int -C'est-ce que l'avantage de modifier réellement la valeur en entiers ). Bien sûr, vous pouvez également le tyroser avec (int) .


0 commentaires

3
votes

de la documentation PHP pour IS_INT:

Remarque: Pour tester si une variable est un nombre ou une chaîne numérique (telle que Entrée de formulaire, qui est toujours une chaîne), Vous devez utiliser IS_Numeric () .


0 commentaires

1
votes

Toute entrée utilisateur est entrée en tant que chaîne, car PHP n'a aucun moyen de dire quel type de données vous attendez que les données soient.

le jeter à un entier ou utilisez une regex si vous voulez vous assurer que c'est un entier. xxx


0 commentaires

1
votes

essayez d'utiliser is_numérique au lieu de is_int . is_numérique vérifie si elle est donnée quelque chose qui peut être un nombre ( $ _ obtenir renvoie les chaînes que je pense). is_int vérifie pour voir si la variable est de type int


0 commentaires

0
votes

Utilisez is_numeric () à Évaluez le contenu et IS_INT () pour évaluer le type.


0 commentaires

0
votes

ou, vous pouvez simplement utiliser une correspondance de regex pour vérifier si la chaîne est un entier.

if(preg_match('/^\d+$/',$_GET['id'])) {
  // is an integer
}


0 commentaires