Comment puis-je vérifier si l'entrée de formulaire est numérique en PHP?

j'ai besoin de voir si un formulaire entré en PHP est numérique. Si elle n'est pas numérique, le site web doit rediriger. J'ai essayé is_numeric (), mais il ne semble pas fonctionner.

Les exemples de Code seront bien.

je développe un panier qui accepte une valeur entière pour la quantité. Je suis en train d'essayer ceci:

if(!is_numeric($quantity)){
                //redirect($data['referurl']."/badinput");
                echo "is not numeric";
        }
10
demandé sur Benjamin 2008-11-25 19:16:25

9 réponses

if(!is_numeric($quantity == 0)){
                //redirect($data['referurl']."/badinput");
                echo "is not numeric";

ce que vous avez ici sont deux conditions imbriquées. Disons quantité de $1.

la première condition évalue 1 = = 0 et renvoie FALSE. La deuxième condition vérifie si FALSE est numérique et retourne FALSE parce que FALSE n'est pas numérique.

il suffit d'écrire:

if (!is_numeric($quantity))
{
    echo 'is not numeric';
}
14
répondu markus 2008-11-25 16:33:56

vous devriez probablement expliquer ce que vous entendez par "numérique" - intégrale, virgule flottante, notation exponentielle, etc.? is_numeric() va accepter toutes ces.

si vous voulez vérifier qu'une chaîne ne contient rien d'autre que des chiffres, alors vous pouvez utiliser une expression régulière, par exemple

/^\d+$/

si vous allez utiliser la valeur actuelle comme si c'était un entier, vous voudrez probablement passer par intval() de toute façon, qui sera de retour 0 si la valeur ne peut pas être analysé - si 0 est une valeur valide, alors vous aurez probablement à gérer cela d'une certaine façon, peut-être en limitant la plus petite plage de la valeur.

7
répondu Rob 2011-11-13 16:49:23

il pourrait également être sage de faire une validation côté client de L'entrée en utilisant JavaScript.

l'aller-retour vers le serveur est long pour ce qui pourrait être une faute de frappe, et vous réduirez les frais généraux du serveur en demandant au navigateur client de faire un peu d'assurance de la qualité à l'avance.

2
répondu infoxicated 2008-11-25 18:31:37

Case is_int et is_numeric. Il y a des exemples dans chacun des liens. Si vous avez besoin de plus d'aide, je posterais les données que vous avez des problèmes avec et un échantillon de code.

EDIT:

$quantity == 0

sera toujours numérique, puisqu'il retournera une valeur booléenne (1 ou 0). La bonne chose à faire:

if ( is_numeric( $quantity ) ) {
...
}

ou

if ( is_int( $quantity ) ) {
...
}
1
répondu gpojd 2008-11-25 16:23:29

une Autre alternative est ctype_digit. À partir de la documentation:

Checks if all of the characters in the provided string, text, are numerical. Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise.

<?php
$strings = array('1820.20', '10002', 'wsl!12');
foreach ($strings as $testcase) {
    if (ctype_digit($testcase)) {
        echo "The string $testcase consists of all digits.\n";
    } else {
        echo "The string $testcase does not consist of all digits.\n";
    }
}
?>

L'exemple ci-dessus va afficher:

La chaîne 1820.20 ne comprend pas de tous les chiffres.

La chaîne 10002 se compose de tous les chiffres.

Le chaîne de wsl!12 ne se compose pas de tous les chiffres.

<?php

$numeric_string = '42';
$integer        = 42;

ctype_digit($numeric_string);  // true
ctype_digit($integer);         // false (ASCII 42 is the * character)

is_numeric($numeric_string);   // true
is_numeric($integer);          // true
?>
1
répondu John Conde 2012-04-08 17:44:38

ce que Rob a dit, bien qu'au lieu d'expressions régulières pour vérifier les chiffres, j'utiliserais ctype_digit

0
répondu Tom Ritter 2008-11-25 16:25:12

tharkun a la meilleure réponse à ce jour. Si vous posez une question comme celle-ci, je pense que vous ne voulez pas vraiment commencer à déconner avec reg-exp juste pour l'instant.

repensez à votre logique. Pourquoi voulez-vous vérifier pour voir si $quantity==0 est un résultat numérique? Si vous essayez d'éviter les erreurs B/c vous pensez qu'il est possible pour la quantité de ne pas avoir une valeur assignée, vous vérifiez un peu en retard. Il s'agit d'un trou de sécurité très commun (et malfaisant) dans votre application -- si quantité de $a une valeur dérivée de la saisie de l'utilisateur, assurez-vous de désinfecter l'entrée avant qu'il n'atteigne ce point dans l'exécution. Comme une plus petite partie de la question, vous n'aurez pas besoin d'attribuer une valeur par défaut, parce que vous avez épuré votre entrée précédemment (et cette épuration est où vous traiteriez d'une situation "sans entrée").

Bonne chance!

0
répondu Travis Leleu 2008-11-25 17:04:42

Utilisez des expressions régulières:/^\d+$/ devrait résoudre le problème

0
répondu Mad Scientist 2012-04-08 20:21:09

essaye ceci:

$numeric = "1"; //true default

$string = trim($_GET['string']);

$chkarray = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ",", ".");

for ($i=0; $i < strlen($string); $i++) { 
    if (!in_array(substr($string, $i, 1), $chkarray)) {
        $numeric = "0";
        break;
    }
}
0
répondu fausto 2014-07-10 09:33:28