2012-02-23 2 views
2

Я хочу защитить свою страницу, проверив, является ли это значение цифровым (0,1,2,3), и если оно находится в диапазоне от 0 до 120. Я думаю, ctype_digit номера функций ограничены, поэтому не может быть передан какой-либо отрицательный результат номер. Как я могу ограничить максимальное значение самым простым способом?Как ограничить максимальное значение числа?

if (!ctype_digit($_GET['category'] AND ...) die(''); 

if (!ctype_digit($_GET['category'] > 120) ? 

Я был thinkig о intval, но он может передать отрицательные числа.

+1

Просто введите его в целое число с '(int) $ _ GET ['category']' и проверьте, равен ли он> = или меньше 120. –

+0

Почему вы сравниваете логическое значение, возвращаемое ctype_digit с номером? –

+0

@ N.B. Десятичное число (42.384) пройдет, но не должно – jprofitt

ответ

4
if (!ctype_digit($_GET['category']) || $_GET['category'] > 120) die('') 

В основном это говорит: «Если это не число или, если это больше, чем 120, остановка»

+0

до тех пор, пока 0 не является допустимым вводом, я бы предложил '! Ctype_digit ($ _ GET ['Category'])> 0', если 0 недействителен, и> = если 0 действительно. – Rufinus

+0

'ctype_digit' возвращает логическое значение, поэтому вы не можете проверить 0 –

+0

о, извините, моя ошибка. для такой проверки формы я всегда использую функцию filter_var. http://php.net/manual/de/function.filter-var.php – Rufinus

0

if (is_int($_GET['category']) and $_GET['category'] > 0 and $_GET['category'] <= 120)

Это будет проверять, если число больше нуля и меньше или равно 120 .

+0

'12.5' передает эти тесты. –

+0

Ах, я забыл все цифры. – OptimusCrime

+0

$ _GET ["category"] никогда не будет целочисленного типа, пока вы его не произнесете, даже если пользователь передал целое число. это будет строка типа. протестируйте сам 'var_dump (is_int ($ _ GET [" test "]), is_string ($ _ GET [" test "]));' – Basti

0
if(!ctype_digit($_GET['category']) || $_GET['category'] > 120) //do whatever you want 
0
if(!ctype_digit($_GET['category']) || $_GET['category'] > 120) { 
... 
+0

ctype_digit возвращает false, если есть точка – lamplightdev

0
// Make sure it is an integer. 
$category = (int) $_GET['category']; 

if($category<0 OR $category>120){ 
    // Code to be executed if the number is out of range... 
} 
5

Возможно, вы захотите взглянуть на PHP's Data Filtering.

Это обеспечивает фильтр для вашей задачи (FILTER_VALIDATE_INT), который также принимает min_range и max_range параметры:

$value = filter_var($_GET['category'], FILTER_VALIDATE_INT, array(
    'options' => array(
     // An optional default value 
     'default' => 123, 

     // Desired validation range 
     'min_range' => 0, 
     'max_range' => 120 
    ), 
)); 

// $value is FALSE when validation failed, or an "int" with 
// the correct value. 
+1

для фильтрации входных суперглобал, которые вы также можете использовать 'filter_input (INPUT_GET, 'category', $ options)', хотя это затрудняет тестирование, потому что вы не можете установить входные переменные в своих тестах. – Gordon

0

не ответ, но вот почему то, что у вас не будет работать:

if (!ctype_digit($_GET['category'] > 120) ? 
       ^^^^^^^^^^^^^^^^^^^^^^^ 

Указанная часть находится внутри вызова типа ctype. Поэтому первый PHP проверяет, превышает ли значение GET 120, превратив это в логическое значение true/false. THEN применяется тип ctype, который всегда будет ложным, поскольку логическое значение не является цифрой.

0

Я добавляю это, так как некоторые люди могут наткнуться на поиск пути к этой задаче на основе темы вашего вопроса.
Иногда вы просто хотите «ограничить максимальное значение числовой переменной».

$val=($val <= 120)?$val:120; 

Это лучший способ я нашел в одной строке (сочетание мин() и MAX() может сделать то же самое, но это гораздо более расчет интенсивный) Если $ Допустимы больше, чем 120 будет обрезается до 120, в противном случае используется исходное значение.

Смежные вопросы