Вот мой код:
<?php
$id = $_GET["id"];
if (is_int($id) === FALSE) {
header('HTTP/1.1 404 Not Found');
exit('404, page not found');
}
?>
Это всегда входит в если.
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 октября, так как оно все еще набирает голоса и было несколько запутанно сформулировано)
.Пользовательский ввод в массив $ _GET (а также в другие суперглобальные объекты) принимает форму строк.
is_int
проверяет тип (т.е. строка
) значения, а не то, содержит ли оно целочисленные значения. Для проверки того, что входная строка является целочисленной строкой, я бы предложил что-то вроде ctype_digit
или целочисленный фильтр ( FILTER_VALIDATE_INT
- это дает преимущество фактического изменения значение для ввода целого числа). Конечно, вы также можете привести его к типу с помощью (int)
.
Любой пользовательский ввод представляет собой строку, потому что PHP не может определить, какой тип данных вы ожидаете от данных.
Преобразуйте его в целое число или используйте регулярное выражение, если хотите убедиться, что это целое число.
<?php
$id = $_GET["id"];
if ((int) $id == 0) {
header('HTTP/1.1 404 Not Found');
exit('404, page not found');
}
?>
Из документации PHP для is_int:
Примечание. Чтобы проверить, является ли переменная число или числовая строка (например, ввод формы, который всегда является строкой), вы должны использовать is_numeric () .
Попробуйте использовать is_numeric
вместо is_int
. is_numeric
проверяет, задано ли ему что-то, что может быть числом (я думаю, $ _ GET
возвращает строки). is_int
проверяет, имеет ли переменная тип int