Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > не так работает intval


Автор: begin 11.10.2007, 15:04
Сделал такую проверку данных на предмет того, что они являются числом:
Код

if (intval($_GET['category'])==$_GET['category'])

Но почему то через это условие спокойно проходят и данные вида: "dfgjh", т.е. к числам не имеющие никакого отношения.
Может лучше проверять по-другому?

Автор: Daevaorn 11.10.2007, 15:12
Цитата(begin @  11.10.2007,  16:04 Найти цитируемый пост)
Может лучше проверять по-другому? 

http://ru2.php.net/manual/ru/function.is-numeric.php

Автор: begin 11.10.2007, 15:25
да, спасибо, насчет is_numeric уже дошло.
но все же, почему не работает вариант с intval?
ведь для текста она выдаст пустую строку, а она ведь не равна первоначальному тексту и условие не будет соблюдаться?

Автор: MichaelMakarov 11.10.2007, 15:57
Цитата(begin @  11.10.2007,  15:25 Найти цитируемый пост)
но все же, почему не работает вариант с intval?

Он работает. Просто ты неправильно его используешь.
Вот она слабая типизация - и соответствующие ошибки.

Цитата(begin @  11.10.2007,  15:25 Найти цитируемый пост)
ведь для текста она выдаст пустую строку, а она ведь не равна первоначальному тексту и условие не будет соблюдаться?

intval вернёт не пустую строку, а ноль.
Затем этот ноль будет сравниваться со строкой.
PHP попытается привести строку к числовому виду и.... в случае "dfgjh" получит ноль.
Далее будет вычисляться сравнение 0 == 0, которое даст результат true.

Цитата(begin @  11.10.2007,  15:04 Найти цитируемый пост)
Может лучше проверять по-другому?

Юз да is_numeric.

Автор: console 11.10.2007, 15:58
begin, потому что ==, пиши:
Код

if (intval($_GET['category'])===$_GET['category'])


Добавлено через 52 секунды
))... опередили  smile 

Автор: MichaelMakarov 11.10.2007, 16:01
Цитата(console @ 11.10.2007,  15:58)
begin, потому что ==, пиши:
Код

if (intval($_GET['category'])===$_GET['category'])


Добавлено @ 15:59
))... опередили  smile

Не прокатит.
Число 0 и строка "0" не равны.
Т.е.
Код

0 === "0"

даёт false.

Автор: begin 11.10.2007, 16:20
Я уже исправил весь код проверок с intval на is_numeric
Теперь дошло по-настоящему.
Последнее уточнение:
если я проверяю в условии, является ли переменная числом, нужно ли потом, в дальнейшем коде, когда я буду использовать ее в запросах, приводить ее с помощью intval?
Наверное нет, так как "не число" дальше проверки условия уже не попадет?

Автор: vasac 11.10.2007, 20:08
Лучше не гадать, а приводить. Хуже не станет.
Думаете, что знаете все ньюансы? А то, что is_numeric() спокойно пропустит "0x45" или "27.3e-3" учли?
А лучше приводите сразу к числу без всяких проверок.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)