PHP $ _GET и $ _POST неопределенная проблема - PullRequest
4 голосов
/ 01 сентября 2009

Я новичок в 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.[site].com/test.php#login

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

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

Ответы [ 5 ]

28 голосов
/ 01 сентября 2009

Для нового сервера 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=...)

6 голосов
/ 01 сентября 2009

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

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

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

3 голосов
/ 23 марта 2011

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

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

3 голосов
/ 01 сентября 2009

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

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

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

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

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

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

2 голосов
/ 19 июня 2010

Это потому, что confirm переменная строки запроса, похоже, не установлена, вы можете проверить ее следующим образом:

ini_set('display_errors', true);
error_reporting(E_ALL);

var_dump($_GET['confirm']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...