У меня есть такая страница:
http://sitename/gallery.php?page=2
Внизу есть ссылки на страницы, по которым мы можем просматривать. Каждый раз, когда номера страниц нажимаются, он отправляет запрос GET с параметрами page = 1 или page = 2 и так далее …
Когда я храню эти значения в $page
из переменной $_GET
, это строковое значение. Я могу преобразовать его в целое число с помощью (int)
следующим образом:
if(!empty($_GET['page'])){ $page = (int)$_GET['page']; echo "Page Number: ".$page; }
Но как я могу убедиться, что переданное значение является целым числом, а не другим дерьмом?
Использование фильтров:
if (null !== ($page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE))) { // $page is now an integer }
Это также проверяет, появляется ли переменная в строке запроса одновременно. Если вы хотите различать отсутствующие и недействительные, вы должны оставить последний аргумент filter_input()
:
$page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT); // $page can be null (not present), false (present but not valid) or a valid integer
Используйте filter_var()
с фильтром FILTER_VALIDATE_INT
на нем и проверьте возвращаемое значение.
Используйте is_numeric () .
is_int()
не будет работать, потому что параметры GET всегда являются строками.
Я оставил несколько комментариев здесь и там. Благодаря слабой типизации функции типа empty
и isset
имеют тенденцию быть ненадежными. Самый быстрый способ проверить, является ли параметр int или нет IMO, будет следующим:
if (array_key_exists('page',$_GET) && ($_GET['page'] == (int) $_GET['page']))
Приведение к int и последующее сравнение соответствующих значений вернет true, только если $_GET['page']
является допустимым int. Если вы хотите использовать строгое сравнение типов по какой-либо причине (некоторые делают), вы можете выполнить двойное нажатие:
if (array_key_exists('page',$_GET) && ($_GET['page'] === (string)((int) $_GET['page'])))
Но в этом конкретном случае я не могу понять, почему вы хотели бы сделать это
это способ проверки параметра, если он является intetger или нет.
if (is_int((int) $_GET['user_id']) && (int) $_GET['user_id'] != 0) { $user_id = $_GET['user_id']; }
Использование is_int
, вероятно, не поможет. Все входящие параметры (включая $ _GET и $ _POST) анализируются как строки PHP. Функция is_int
проверяет тип данных, а не значение. ctype_digit
проверяет только цифры:
if(isset($_GET['page']) && ctype_digit($_GET['page']){ $page = (int)$_GET['page']; echo "Page Number: ".$page; }
if(!empty($_GET['page']) and is_numeric($_GET['page'])){ $page = (int)$_GET['page']; echo "Page Number: ".$page; }
is_numeric , вероятно, то, что вам нужно.
Вы также можете проверить
isNAN($_GET['something']);//is_numeric($_GET['something'])
он возвращает логическое значение (true, flase) …. если его true, то это не целое число, если false его целое число.
if (isset($_GET['page']) && (($get_page_filtered = filter_var($_GET['page'], FILTER_VALIDATE_INT)) !== FALSE) { $get_page_int = $get_page_filtered; }