is_int () не может проверить $ _GET в PHP?

Вот мой код:

<?php
$id = $_GET["id"];

if (is_int($id) === FALSE)  {
    header('HTTP/1.1 404 Not Found');
    exit('404, page not found');
    }
?>

Это всегда входит в если.

7
задан ilhan 28 June 2010 в 18:25
поделиться

5 ответов

is_int проверяет, что тип данных является целым числом, но все в $_GET будет строкой. Поэтому он всегда будет возвращать false.

В крайнем случае, можно привести к целому числу, а затем проверить на != 0.

$id = isset($_GET['id']) ? (int) $_GET['id'] : null;

if (!$id) { // === 0 || === null
  header('HTTP/1.1 404 Not Found');
  exit('404, page not found');
}

Но более надежным решением будет проверка/фильтрация входной строки, например, встроенный в PHP filter_input_array().

(Отредактировано сообщение 13 октября, так как оно все еще набирает голоса и было несколько запутанно сформулировано)

.
32
ответ дан 6 December 2019 в 04:59
поделиться

Пользовательский ввод в массив $ _GET (а также в другие суперглобальные объекты) принимает форму строк.

is_int проверяет тип (т.е. строка ) значения, а не то, содержит ли оно целочисленные значения. Для проверки того, что входная строка является целочисленной строкой, я бы предложил что-то вроде ctype_digit или целочисленный фильтр ( FILTER_VALIDATE_INT - это дает преимущество фактического изменения значение для ввода целого числа). Конечно, вы также можете привести его к типу с помощью (int) .

5
ответ дан 6 December 2019 в 04:59
поделиться

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

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

<?php
$id = $_GET["id"];

if ((int) $id == 0)  {
    header('HTTP/1.1 404 Not Found');
    exit('404, page not found');
    }
?>
1
ответ дан 6 December 2019 в 04:59
поделиться

Из документации PHP для is_int:

Примечание. Чтобы проверить, является ли переменная число или числовая строка (например, ввод формы, который всегда является строкой), вы должны использовать is_numeric () .

3
ответ дан 6 December 2019 в 04:59
поделиться

Попробуйте использовать is_numeric вместо is_int . is_numeric проверяет, задано ли ему что-то, что может быть числом (я думаю, $ _ GET возвращает строки). is_int проверяет, имеет ли переменная тип int

1
ответ дан 6 December 2019 в 04:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: