Уж слишком часто проскакивает этот момент, предлагаю всё-же обсудить. Допустим мы ожидаем число из $_GET['num'], и нам надо его использовать... Многие считают что правильно так: (даже в рнрВВ2 так реализовано) PHP: <?php $num = isset($_GET['num']) ? intval($_GET['num']) : 0; Или тоже самое PHP: <?php $num = isset($_GET['num']) ? (int)$_GET['num'] : 0; Я считаю не так, и вот почему. 1 - Числа более 2млрд или менее -2млрд уже не прокатят (на 64-х битных системах говорят ограничения по выше, но как бы то ни было оно есть, и это нелогично) 2 - '2фывапро' будет равняться 2 (а это не одно и тоже) Грубо говоря всё это не проблема, а проблема в том что такие действия не являются логичными. И если первое можно исправить так: (Если отрицательные значения не нужны) PHP: <?php $num = isset($_GET['num']) ? abs($_GET['num']) : 0; Или так: (если отрицательные значения могут быть) PHP: <?php $num = isset($_GET['num']) ? 0+$_GET['num'] : 0; Или даже так: (разврат, но работает) PHP: <?php $num = 0+@$_GET['num']; то второе остаётся в силе... На мой взгляд, задачу надо разделить на несколько важных моментов. 1 - Для чего мы ждём это число ? (могут ли например там быть отрицательные значения) 2 - Обязательно ли мы ждём число, или есть значение по умолчанию если ничего не пришло ? 3 Что делать если что-то пришло, но не то что мы не ждём ? Все эти моменты очень важны, и влияют на оптимальность решения. На мой взгляд данные надо не "приводить к нужному нам виду" а проверять "нужные данные пришли или шлак" Таким образом если мы решим получить число то. Во всех случаях надо: - Убедиться что число именно пришло // isset($_GET['num']) Если нужно именно число, то надо: - Убедиться что пришло именно число // is_numeric если допустимы отрицательные или ctype_digit если недопустимы Для конкретно постраничной разбивки надо: - Убедиться что число не меньше 1 // $_GET['num'] >= 1 - Убедиться что число не больше количества страниц // $_GET['num'] <= $pages (№4 кстати игнорируют вообще почти все, хотя это неправильно с точки зрения логики) Т.е даже самая простая постраничная разбивка должна быть как минимум не хуже этого примера... PHP: <?php // Шаг 1 if ( !isset($_GET['page']) ) { die('выводим ошибку 404 или редирект на первую страницу, итд'); } // Шаг 1 альтернативный (если по умолчанию есть значение, в нашем случае 1) $_GET['page'] = isset($_GET['page']) ? $_GET['page'] : 1; // Шаг 2 и 3 можно объединить if ( !ctype_digit($_GET['page']) || $_GET['page'] < 1 ) { die('выводим ошибку но так-же посылаем нафик кулхацкера который пихает в URL всякую фигню, хотя может кто-то опечатался просто'); } // Шаг 4 (теперь уже можно подконектиться к базе и) if ( $_GET['page'] > $pages ) { die('Сообщаем что страницы нету, например пишем что страница могла быть удалена и ссылка устарела, или просто 404 по вкусу'); } // замечу так-же что я не копирую $_GET['page'] в просто $page // Зачем ? Кому станет проще если у нас будет 2 одинаковые переменные ? Кто со мной, а кто хочет с этим аргументированно поспорить ?
обычно, "ожидаю" положительно число и != 0. Следующая фишка отрабатывается на ура: ничего другого и не нужно придумывать. С миллиардами дел не имел. А abs() чаще не юзаю, так как проверка есть, типа: if($id > 0) else $error = '';
Чем тогда $num = 0+@$_GET['num']; хуже ? (случаев когда отсутствие нотисов в логах из-за собаки быть не может физически, тогда почему бы не упростить лишьний раз код ?)
is_numeric наше все! PHP: <? is_numeric('8728473889823432489789987890894329084'); // true is_numeric('-8728473889823432489789987890894329084'); // true is_numeric('+8728473889823432489789987890894329084'); // true is_numeric('8728473889823432489789987890894329084bla'); // false
Апельсин Поясни. Собака это вполне официальная конструкция языка, почему её использование так тебя пугает ? Ты можешь привести пример когда (в этом примере) она явится причиной какого либо бага ? Или просто какой-то умник так сказал, а ты повторяешь ?
Vladson причем тут баг. Говнокод - это не всегда бажный кусок кода, он просто неграмотно/неудобно/некрасиво написан, но работать может точно также как и конфетка. Собака не есть хорошим тоном. Да, заюзать можно, когда это точно не вызовет какихто последствий. Например: Гуд: $var = null; for($i = 0; $i < $some; $i++) { $var .= ' word'; } Не есть гуд: for($i = 0; $i < $some; $i++) { @$var .= ' word'; } Результат будет одинаков, тут можно бы юзать собаку. Если пишешь для себя - делай как хочешь. А если ктото другой будет читать код - можно и по-человечески сделать. Просто когда привыкаешь к обработке ошибок то везде суешь проверки, а когда начинаешь собачить - то потом можно сэкономленное время вдвойне потратить на дебаг. UP Если умник сказал толковую мысль, то почему бы не повторять
$var = ""; в этом случае правильнее, и в твоём примере собака действительно говнокод потому что переменная должна быть (иначе будет уязвимость) Где неграмотность ? Где неудобство ? Кто сказал что строка в чёрт знает сколько символов с условиями красивее чем коротенькое объявление переменной ? У него должны были бы быть аргументы, и у тебя ибо ты с ним согласился. Не вижу их. Повторяю, приведи пример того когда моя собака (в отличии от твоей) сделает хуже ? (принимаются даже нелепые отмазы что "когда выйдет РНР 99.9.9 её отменят итд")
нет, именно null. И проверку делаю через null $text = isset($_POST['text'])?$_POST['text']:null; а это поповщина. Еще напиши: if(isset($_POST['text'])) $text = $_POST['text']; else $text = ''; попов именно так рекомендовал. далее @ - это подавление ошибок. Обработка ошибок и подавление их - это разные вещи. В первом случае у тебя под контролем то что ты ожидаешь получить, во втором (твоем) это называется - А хyй его знает что там прийдет, заглушу на всякий случай. В твоем случае можно через @, твое дело. Только негласно принято придерживаться какогото одного стиля именования переменных, функция, точно так же и обработки стандартных (число, строка) переменных. А не один раз через @, второй раз через тернарный оператор. какие аргументы должны быть у хорошего тона написания кода? давай все в одну километровую строку писать, один хрен, все обработается правильно и без багов. Это ты предлагаешь? пхп позволяет писать ногами, какие конечности у человека более развиты - теми пусть пишет.
Твоё право, но изменение типа таким образом не является хорошим тоном. В строго типизованных например языках пришлось бы делать типа var = convert2string(null); (а РНР однажды уже думали сделать более типизованным, хотя и передумали, но в некоторых случаях даже нотисы выскакивают)
главное чтобы работало без ошибок и было удобно. сам пользуюсь $id = (isset($_POST['id']) && $_POST['id']>0) ? (int)$_POST['id'] : 0; Согласен с Апельсин, что собака - это конструкция, которую не нужно использовать где попало.
пришлось бы и тебе со свою конструкцию $var = ""; переписывать в таком соответствии с указанием типа переменной.
Ладно отложим собаку, я в принципе согласен что это "не к месту" в хорошем проекте, о чём написал сразу А что касается всего остального ??? Ошибки будут при больших числах, о чём я и написал. Код (Text): $test = ""; var_dump( $test); HTML: string(0) ""
Gromo как я уже говорил юзаю такое: $id = isset($_POST['id'])?(int)$_POST['id']:0; if($id > 0)//action else //error таким методов двух зайцев шлёпаю - и проверка на отрицательное число, и не равняется нулю. потому в твоем случае тот кусок излишний
А в реальном приложении, ты ведь ожидаешь определенные числа и если у тебя реально не должны приходит большие числа, то ... Вообщем ничья 1:1 )))
если нужны только положительные числа, следовательно, должна следовать еще одна проверка на то что число > 0 в итоге тот выделенный кусок будет продублирован
to Зверь to Vladson в своем первом сообщении я написал про то что это не "миллиардный" подход. Нечего мое решение для чисел, максимум до миллиона "натягивать" на решение псевдопроблемы, описанное Владсоном.