2015-08-22 2 views
4

Я изучаю PHP, и я надеюсь, что вы можете объяснить, почему автор учебника по корзине сделал это в призыве добавить товар в корзину.

if(isset($_GET['action']) && $_GET['action']=="add") 

Сайт проверяет $_GET[action] установлен и что $_GET[action] равно «добавить» перед обработкой, но не это функционально эквивалентно просто:

if($_GET['action']=="add") 

Потому что, если значение «добавить» у него есть, и если он не установлен, его нельзя «добавить» правильно? Или я чего-то не хватает?

+2

Почему бы не найти его самостоятельно? Убедитесь, что включен отчет об ошибках: 'ini_set (" display_errors ", 1); \t error_reporting (E_ALL); 'Затем вызовите URL-адрес один раз с помощью строки запроса, например. 'xy.php? action = add' и один раз без него:' xy.php' – Rizier123

ответ

4

Цитирую the documentation:

Попытка доступа ключа массива, который не был определен такой же, как и к любой другой неопределенной переменной: сообщение об ошибке E_NOTICE уровня будет выдан, и результат будет НОЛЬ.

Проверка isset является хорошей защитной мерой, чтобы ваши журналы не были распущены этими (бесполезными) сообщениями.

+0

Я бы не назвал их бесполезными - если бы код был бы 'if ($ _ GET ['action'] == 0)' message будет указывать на реальную (потенциальную) проблему. – fvu

+0

@fvu Возможно, это была не самая большая формулировка. В этом случае они не добавляют никакой полезной информации - вы хотели проверить, есть ли 'GET ['add']'. Вы точно знаете, что делаете, и почему он терпит неудачу. Не похоже, чтобы у вас был удивительный пользовательский ввод, к которому вы не были готовы. – Mureinik

+0

Спасибо, это имеет смысл. Результатом второго неудачного сравнения будет ошибка, тогда как первое сравнение будет просто нулевым, что было бы лучше, если бы он не был настроен на «добавление». – AzzaClazza

0

Это необходимо потому, что во-первых, она будет проверять его, установлен ли $_GET['action'] означает, что он не является нулевым, а затем проверяет, что это должно быть значение add затем выполнить определенный код, а не если значение edit или что-нибудь еще.

1

Нет, не то же самое. Рассмотрим запрос, такой как ?action=add&product=banana - в этом случае утверждение if(isset($_GET['action']) && $_GET['action']=="add") будет действительным, и скрипт может обрабатывать все, что требовалось, как только это условие было удовлетворено. Если вы опустите параметр action и используете запрос, такой как ?product=banana&colour=red, оператор if выдаст предупреждение об неопределенных индексах.

В isset тесты, названная переменная доступна в $_GET массиве - в качестве альтернативы можно использовать if(array_key_exists('action',$_GET) && $_GET['action']=='add'){ и т.д.

5

Нет, это еще не то же самое Позвольте мне explaint 1. Исеть проверить либо ключ установлен в массиве 2. Дважды равно проверить простое сравнение

0

ответ уже был дан, но я хотел бы добавить, что в таком состоянии, которое использует & & правая рука выражение не будет г et, если левое выражение уже возвращено false. Так следующий будет по-прежнему возвращает предупреждение-уведомление, если ошибки отчетность устанавливаются соответственно:

if($_GET['action']=="add" && isset($_GET['action'])) 

Вы должны проверить Исеть() первой, как это было сделано в вашем примере коды.

Больше примеров на пути PHP обрабатывает логические операторы в условиях: http://php.net/manual/en/language.operators.logical.php#example-139

Смежные вопросы