Как я могу проверить, является ли ввод формы числовым в PHP? - PullRequest
10 голосов
/ 25 ноября 2008

Мне нужно, чтобы увидеть, является ли ввод формы в PHP числовым. Если он не числовой, сайт должен перенаправить. Я пробовал is_numeric (), но, похоже, он не работает.

Примеры кода будут хорошими.

Я разрабатываю корзину для покупок, которая принимает целочисленное значение для количества. Я пытаюсь это:

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

Ответы [ 9 ]

14 голосов
/ 25 ноября 2008
if(!is_numeric($quantity == 0)){
                //redirect($data['referurl']."/badinput");
                echo "is not numeric";

То, что у вас есть, это два вложенных условия. Допустим, количество $ равно 1.

Первое условие оценивает 1 == 0 и возвращает ЛОЖЬ. Второе условие проверяет, является ли FALSE числовым, и возвращает FALSE, потому что FALSE не является числовым.

просто напишите:

if (!is_numeric($quantity))
{
    echo 'is not numeric';
}
7 голосов
/ 25 ноября 2008

Вы, вероятно, должны объяснить, что вы подразумеваете под "числовым" - целое число, число с плавающей запятой, экспоненциальная запись и т. Д.? is_numeric() примет все это.

Если вы хотите проверить, что строка не содержит ничего, кроме цифр, вы можете использовать регулярное выражение, например,

/^\d+$/

Если вы собираетесь использовать фактическое значение, как если бы оно было целым числом, вы, возможно, захотите передать его через intval() в любом случае, что вернет 0, если значение не может быть проанализирован - если 0 является допустимым значением, то вам, вероятно, придется каким-то образом обработать это, возможно, ограничив нижний диапазон значения.

2 голосов
/ 25 ноября 2008

Также может быть целесообразно выполнить некоторую проверку ввода на стороне клиента с помощью JavaScript.

Обратный путь к серверу и обратно - длительный процесс, который может привести к опечатке, и вы сократите нагрузку на сервер, сделав браузер клиента заранее с некоторой гарантией качества.

1 голос
/ 08 апреля 2012

Другая альтернатива - ctype_digit. Из документов:

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";
    }
}
?>

Приведенный выше пример выдаст:
Строка 1820.20 не состоит всех цифр.
Строка 10002 состоит из всех цифр.
Строка wsl! 12 не состоит из всех цифр.

<?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 голос
/ 25 ноября 2008

Проверьте is_int и is_numeric . В каждой из ссылок есть примеры. Если вам нужна дополнительная помощь, я опубликую данные, с которыми у вас возникли проблемы, и пример кода.

РЕДАКТИРОВАТЬ:

$quantity == 0

всегда будет числовым, поскольку будет возвращать логическое значение (1 или 0). Правильно сделать это:

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

или

if ( is_int( $quantity ) ) {
...
}
0 голосов
/ 10 июля 2014

Попробуйте это:

$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 голосов
/ 08 апреля 2012

Используйте регулярные выражения: /^\d+$/ должно решить проблему

0 голосов
/ 25 ноября 2008

у Таркуна пока лучший ответ. Если вы задаете такой вопрос, я думаю, что вы пока не хотите начинать возиться с reg-exp.

Переосмыслите свою логику. Почему вы хотите проверить, является ли $ amount == 0 числовым результатом? Если вы пытаетесь избежать ошибок, так как считаете, что количество может не иметь назначенного значения, вы немного опоздали. Это очень распространенная (и гнусная) дыра в безопасности в вашем приложении - если $ amount имеет значение, полученное вообще из пользовательского ввода, пожалуйста, обязательно очистите входные данные до того, как они достигнут этой точки выполнения. Как небольшая часть проблемы, вам не нужно будет назначать значение по умолчанию, потому что вы дезинфицировали свой ввод ранее (и эта дезинфекция - то, где вы будете иметь дело с ситуацией «без ввода»).

Удачи!

0 голосов
/ 25 ноября 2008

Что сказал Роб, хотя вместо регулярных выражений для проверки на цифры я бы использовал ctype_digit

...