Как я могу проверить, является ли ввод формы числовым в PHP?

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

Примеры кода будут приятными.

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

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

Ответ 1

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

У вас есть два вложенных условия. Пусть say $количество равно 1.

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

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

if (!is_numeric($quantity))
{
    echo 'is not numeric';
}

Ответ 2

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

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

/^\d+$/

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

Ответ 3

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

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

Ответ 4

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

ИЗМЕНИТЬ:

$quantity == 0

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

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

или

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

Ответ 5

Другой альтернативой является 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 состоит из всех цифр.
string 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
?>

Ответ 6

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

Ответ 7

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

Переосмыслить свою логику. Почему вы хотите проверить, является ли $number == 0 числовым результатом? Если вы пытаетесь избежать ошибок b/c, вы считаете возможным, чтобы количество не имело назначенного значения, вы проверяете немного позже. Это очень распространенное (и гнусное) отверстие безопасности в вашем приложении - если значение $quantity имеет значение, полученное от входа пользователя, убедитесь, что вы дезактивируете ввод до того, как он достигнет этого момента в процессе выполнения. В качестве меньшей части проблемы вам не нужно будет присваивать значение по умолчанию, потому что ранее вы дезинфицировали свой ввод (и эта санировка - это то, где вы будете иметь дело с ситуацией "без ввода" ).

Удачи!

Ответ 8

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

Ответ 9

Попробуйте следующее:

$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;
    }
}