Intereting Posts
Должна ли GD так много памяти при изменении размера? Как отправить данные json_encode с помощью HTML5 SSE Как связать параметры массива в структуре YII? Как заполнить второе раскрывающееся меню на основе выбора первого раскрывающегося списка с использованием jQuery / AJAX и PHP / MySQL? как отправить уведомление миллионам устройств Android в php с использованием GCM передача переменных между функциями и файлами в php вложенные в петлю трудности PHP preg_replace три раза с тремя разными шаблонами? правильно или неправильно? Удалить имя контроллера из URL-адресов в Yii2 Ошибка SMTP Gmail с помощью Codeigniter 2.1.3 Загрузка нескольких изображений PHP с одним вводом Как получить общее количество столбцов, если строки разбиты на страницы? Zend Framework 2 – Отправка формы Отображение значений пользовательских полей продукта в заказе после обработки Временная зона файлов журналов PHP

is_int и GET или POST

Почему is_int всегда возвращает false в следующей ситуации?

 echo $_GET['id']; //3 if(is_int($_GET['id'])) echo 'int'; //not executed 

Почему is_int всегда возвращает false?

Поскольку $_GET["id"] является строкой, даже если она содержит число.

Ваши варианты:

  • Используйте расширение фильтра . filter_input(INPUT_GET, "id", FILTER_VALIDATE_INT) вернет переменную с целым типом, если существует переменная, не является массивом, представляет собой целое число и это целое число находится в допустимых границах. В противном случае он вернет false .

  • Force прикладывает его к integer (int)$_GET["id"] – возможно, не то, что вы хотите, потому что вы не можете правильно обрабатывать ошибки (т. Е. «Id» не является числом)

  • Используйте ctype_digit() чтобы убедиться, что строка состоит только из чисел и, следовательно, является целым числом – технически это возвращает true также с очень большими числами, которые находятся за пределами области int , но я сомневаюсь, что это будет проблемой. Однако обратите внимание, что этот метод не будет распознавать отрицательные числа.

Не используй:

  • is_numeric() поскольку он также распознает значения float (1.23132)

Поскольку переменные HTTP всегда являются либо строками, либо массивами. А элементы массивов всегда являются строками или массивами.

Вам нужна функция is_numeric , которая вернет true для "4" . Либо это, либо передайте переменную в int $foo = (int) $_GET['id']

Вероятно, он хранится как строка в $ _GET, отбрасывает его в int.

Потому что $ _GET – это массив строк.

Чтобы проверить, содержит ли параметр get целое число, вы должны использовать is_numeric()

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

Грязное решение, которое я использую, таково:

 $val = trim($_GET['id']); $cnd = ($val == (int)$val); echo $cnd ? "It's an int" : "Not an int"; 

Помимо очевидного (уродливого кода, который скрывает его работу за спецификой PHP-движка), знает ли кто-нибудь случаи, когда это происходит не так?

Проверка целых чисел с использованием is_int($value) вернет false для строк.

is_int((int) $value) значения – is_int((int) $value) – не поможет, потому что строки и поплавки приведут к ложному срабатыванию.

is_numeric($value) отклонит не числовые строки, но поплавки все равно пройдут.

Но дело в том, что float cast to integer не будет равным себе, если он не является целым числом. Поэтому я придумал что-то вроде этого:

 $isInt = (is_numeric($value) && (int) $value == $value); 

Он отлично работает для целых чисел и строк … и некоторых плавающих чисел.

Но, к сожалению, это не сработает для некоторых целых чисел.

 $number = pow(125, 1/3); // float(5) -- cube root of 125 var_dump((int) $number == $number); // bool(false) 

Но это совершенно другой вопрос.

Оптимально лучший способ проверить, является ли значение из GET или POST целым, проверяет preg_match

 if( preg_match('/^[0-9]+$/', $_GET['id'] ){ echo "is int"; } 

Вы можете попробовать intval() который может быть использован для проверки значения вашего var. например

 If(intval($_GET['ID']==0) 

Функция проверяет, является ли var целым и возвращает TRUE если не FALSE