PHP $ _GET и $ _POST неопределенная проблема

Я новичок в PHP, поэтому прошу прощения, если это простая проблема …

Я перемещаю PHP-сайт с одного сервера на другой. Новый сервер – IIS 7.0, PHP 5.2.1, с коротким открытым тегом, включенным «Вкл.», И я не знаю, как был настроен исходный сервер (мне просто дали код).

Ниже приведен самый первый раздел кода на одной из страниц:

<? ob_start(); session_start(); if($_GET['confirm'] == 13 || $_GET['confirm'] == 14 || $_GET['confirm'] == 15 || $_GET['confirm'] == 16) { include("test/query/test_query.php"); } ?> 

Когда эта страница выполняется, всегда отображается следующая ошибка:

Примечание PHP: Неопределенный индекс: подтвердите в [местоположение файла] .php в строке 6

Кроме того, пользователи получают доступ к этой странице, перенаправляясь с домашней страницы (которая является стандартной HTML-страницей). Полный URL-адрес при правильной навигации:

HTTP:. // WWW [сайт] .com / test.php # Войти

… Я понимаю, почему возникает ошибка. Я не понимаю, как этот код мог работать, как на исходном сервере. Могу ли я пропустить настройку конфигурации?

* Эта же проблема происходит в десятках мест по всему сайту. Это всего лишь одно конкретное событие проблемы.

На новом сервере установлен параметр error_reporting для E_ALL. То, что вы видите, – это уведомление, а не ошибка. Пытаться:

 error_reporting(E_ALL ^ E_NOTICE) 

С сообщением об ошибках, установленным в E_ALL, доступ к члену массива, который не задан, порождает ошибку. Если вы не хотите понижать уровень отчетности об ошибках, перед проверкой $ _GET ['var'] измените свой код на:

 if(isset($_GET['confirm']) && ($_GET['confirm'] == 13 || $_GET['confirm'] == 14 || $_GET['confirm'] == 15 || $_GET['confirm'] == 16)) { 

добавив вызов isset (), прежде чем вы действительно получите доступ к $_GET['confirm'] , вы убедитесь, что вы не получаете доступ к члену массива, который не задан. ( $_GET['confirm'] будет установлен только в том случае, если URL-адрес заканчивается ?confirm=... или ?something...&confirm=... )

Я предлагаю оптимизировать код для чтения:

 if (isset($_GET['confirm']) && ($_GET['confirm'] >= 13 && $_GET['confirm'] <= 16)) 

И я полностью согласен с предложением Джоша.

Поскольку нет индекса $ _GET ['confirm'], PHP выдает уведомление о том, что вы просматриваете неопределенный индекс. Уведомление отображается, поскольку новый сервер имеет флаг E_NOTICE установленный в error_reporting где-нибудь, либо в php.ini, либо в каком-либо файле конфигурации или загрузочном буфере, который запускается в pageloads.

Из руководства по php, E_NOTICE : «Уведомления о времени выполнения. Укажите, что сценарий столкнулся с чем-то, что может указывать на ошибку, но может также произойти в обычном ходе запуска скрипта».

Вы можете попытаться отключить уведомления, если вас не беспокоит их, или использовать их для отслеживания мест, где могут быть проблемы.

Для кода, который вы опубликовали, простым решением было бы изменить условное выражение на

 if(isset($_GET['confirm']) && <list of OR conditions>) 

Таким образом, PHP не выполняет оценку условного, если нет индекса подтверждения.

isset() – полезная функция. Он возвращает «true», если переменная существует и «false», если нет. Обычно люди используют его в сочетании с суперглобальным, например $_GET или $_POST чтобы определить, отправляется ли вам другая страница на сайте – это позволяет вам создавать разные действия на основе того, откуда ваш пользователь и какие данные по пятам. Он также предотвращает ошибки при попытке использовать переменные, которые вы еще не определили, например, OP. Поэтому вместо того, чтобы писать два разных файла .php и беспокоиться о том, чтобы отправить вашего пользователя на неправильный, вы можете сделать все это на одной странице.

Джей, я был бы осторожен в вашем использовании некоторых из этих вызовов. <?php скорее работает, чем <? , Я слышал, что session_start () должен быть первым, что нужно для браузера, или может вызвать проблемы с заголовком. И да, вы должны иметь переменную, объявленную перед ее использованием, – если вы не набрали [file].php?confirm=[some number] качестве своего URL-адреса, ваша страница сломается, если вы не измените ее, чтобы разрешить перерывы ,

Это потому, что строка строки запроса запроса, похоже, не установлена, вы можете проверить ее так:

 ini_set('display_errors', true); error_reporting(E_ALL); var_dump($_GET['confirm']);