Смотрю уроки по php и там автор часто использует связку if (isset(..)&&!empty(..)) для инпута. Для чего нужен ещё и isset() ? Почему не обойтись одним лишь !empty ? Если мы берем данные из input, то заведомо знаем, что он уже существует, не? Или я недопонимаю функцию isset() ?
Да, в большинстве случаев достаточно empty(). Вероятно автор перестраховывается от каких-то специфичных случаев.
И нет, мы не уверены существует ли инпут. Пользователь (хакер) может модифицировать форму через консоль разработчика в браузере. Или даже может сформировать произвольный POST-запрос в стороннем приложении.
UPD: Возможно, стоит фильтровать ввод не через всякие isset'ы, а через filter_input()
Если в текстовом поле, например, ничего не ввели, то и на сервер это поле не передастся.
Если делать проверку только по empty($_POST['foo']), то вылезет NOTICE - Undefined index: foo.
Хороший программист делает так, чтобы код не кидал никаких уведомлений, чтобы спустия несколько месяцев не ловить в продакшене рандомные баги.
Можно проверять через array_key_exists('foo', $_POST), но это значительно дольше набирать.
Алексей Уколов: Я тоже читал про то, что empty() может полностью заменить isset(), но когда пищу if (!empty(...)) вместо if (isset(...) && !empty(...)) внутренний голос говорит что я что то не допроверил... Наверное мне пора лечиться :)
Это в html5 вроде есть проверка на пустоту input а раньше не было и можно было отправить форму вообще без значения нажатием кнопки. На клиенте всякие JS проверки ненадёжны. Да и просто привычка хорошая, особенно при работе с массивами потом.
Нет мы заведомо не знаем. Можно и одним !empty(). Я б порекомендовал проверить существует ли переменная submit (будет существовать если нажмут на кнопку отправки и потом проверять каждое поле только на пустоту, но тут тоже есть заковырка переменные приведение ниже тоже считаются пустотой)
Если переменная не существует, предупреждение не генерируется. Это значит, что empty() фактически является точным эквивалентом конструкции !isset($var) || $var == false
Думаю, Вы правы если есть задача проверить, что та или иная переменная не пуста достаточно использовать (!empty ($var))
Различия же между этими двумя функциями достаточно просты для понимания через isset мы можем проверить существует ли переменная (т.е объявлена ли она) при этом она может быть и пустой.
А empty же в свою очередь проверяет переменную на заполненость. При этом переменная не обязательно должна существовать, тогда как и в случае с пустой переменной данная функция вернет true.