2008-11-25 7 views
10

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

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

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

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

пожалуйста Poste некоторый код, чтобы мы могли понять, почему is_numeric() не работает для вас. – markus

ответ

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

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

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

просто написать:

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

Вы пропустили ')' ... – Tader

+0

Да, я пропустил все эти небольшие ошибки. Спасибо –

7

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

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

/^\d+$/ 

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

+1

В вашем регулярном выражении есть небольшая ошибка. Должно быть/^ \ d + $/ Вам нужно сбежать из d. – MattBelanger

+0

Совершенно верно и исправлено; благодаря! – Rob

1

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

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

$quantity == 0 

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

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

или

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

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

0

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

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

Удачи вам!

+0

Да, вся проблема была от опечатки. Silly me –

2

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

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

+0

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

0

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

1

Другой альтернативой является 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 
?> 
0

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

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