Ответ заключается в использовании переменной $_SERVER
. Например, $_SERVER["REMOTE_ADDR"]
вернет IP-адрес клиента.
Использование фильтров:
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
Использование 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 (isset($_GET['page']) && (($get_page_filtered = filter_var($_GET['page'], FILTER_VALIDATE_INT)) !== FALSE) {
$get_page_int = $get_page_filtered;
}
Я оставил несколько комментариев здесь и там. Благодаря слабой типизации функции типа 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'])))
Но в этом конкретном случае я не могу понять, почему вы хотели бы сделать это
FILTER_VALIDATE_INT
, как показано в этом комментарии: stackoverflow.com/a/12194343/432720
– maxxon15
30 August 2012 в 11:46
(int)
или даже выбор этого варианта был бы лишним! : P Nevermind. Но да ... согласен. Это было бы слишком много.
– maxxon15
30 August 2012 в 12:36
$_GET['page']
не может быть пустой строкой (''
), в этом случае ('' == (int)'') === true
, а '' == (string)((int)'') === false
... sheesh, free typing, должен любить это: s
– Elias Van Ootegem
30 August 2012 в 12:42
Вы также можете проверить с помощью
isNAN($_GET['something']);//is_numeric($_GET['something'])
, он возвращает логическое значение (true, flase) .... если его true, то это не целое число, если false его целое число.
page=12.7548754
будет действительным?
– Elias Van Ootegem
30 August 2012 в 11:38
if(!empty($_GET['page']) and is_numeric($_GET['page'])){
$page = (int)$_GET['page'];
echo "Page Number: ".$page;
}
is_numeric , вероятно, вам нужно.
Используйте filter_var()
с фильтром FILTER_VALIDATE_INT
на нем и проверьте возвращаемое значение.
Используйте is_numeric () .
is_int()
не будет работать, потому что параметры GET всегда являются строками.
это способ проверки параметра, если он целочисленный или нет.
if (is_int((int) $_GET['user_id']) && (int) $_GET['user_id'] != 0) {
$user_id = $_GET['user_id'];
}
filter_var()
. Правильно? – maxxon15 30 August 2012 в 11:39filter_input()
, если знаю, что параметр должен исходить отINPUT_GET
- в противном случае я используюfilter_var()
:) – Ja͢ck 30 August 2012 в 11:52