PHP: Примечание: неопределенный индекс, в котором определена переменная сеанса

Я делаю систему регистрации с верификатором электронной почты. Ваш типичный «использовать этот код для проверки» типа вещи.

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

Что затрудняет диагностику этой проблемы, так это то, что я использовал многие другие переменные сеанса аналогичным образом, но этот не работает вообще. Вот мой подход:

/* This is placed after the mail script and account creation within the same if statement. Things get executed after it, so I know it's placed correctly. */ $_SESSION['registrationComplete'] = TRUE; // I've tried integer 1 and 'Yes' as alternatives. 

Теперь, чтобы проверить переменную, я разместил ее в верхней части страницы.

 echo $_SESSION['registrationComplete']; // To see if it's setting. This gives the // undefined index notice. if (isset($_SESSION['registrationComplete'])) { // Alternatively, I have nested another if that simply tests if it's TRUE. echo $_SESSION['registrationComplete']; // When echo'd here, it displays nothing. echo '<p>Congratulations, Foo! Go to *link to Bar*.</p>'; } 

Теперь я использовал перенаправление страницы на новую страницу, но я взял это, чтобы проверить ее. Когда страница перезагружается из отправки, появляется мое сообщение в выражении if, а затем я получаю Notice: Undefined index: registrationComplete blah blah из эха сеанса var!

Затем, если я когда-либо вернусь к странице, он будет игнорировать утверждение if.

Я тестировал для опечаток и все, очищая переменные сеанса в случае вмешательства старых из тестирования, но мне не повезло. Многие из Googling просто показывают людям, подавляющим эти ошибки, но это звучит безумно! Не только это, но я не получаю то же самое сохранение переменных сеанса в другом месте на моем сайте. Может ли кто-нибудь указать, что я делаю что-то вопиющее? Помогите! Благодаря!

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

В соответствии с запросом, больше кода, в значительной степени аннотированный, чтобы держать его кратким

 var_dump($_SESSION); // It's here to analyze that index message. I guess it's not important. echo $_SESSION['registrationComplete']; if (isset($_SESSION['registrationComplete'])) { // The golden ticket! This is what I want to appear so badly. echo 'Congratulations, Foo! Go to *link to Bar*.'; } // Explanation: I don't want logged in users registering. // The else statement basically executes the main chunk of code. if (isset($_SESSION['user_id'])) { echo 'You are logged in as someone already.'; } else { if (isset($_POST['submitRegister'])) { // Code: Database connection and parsing variables from the form. if (!empty($email) && !empty($email2) && $email == $email2 && !empty($displayName) && !empty($password) && !empty($password2) && $password == $password2) { // Code: Query to retrieve data for comparison. if (mysqli_num_rows($registrationData) == 0) { // Code: Generates the salt and verification code. // Code: Password hashing and sending data to verify database. // E-mail the verification code. $_SESSION['registrationComplete'] = 'yes'; } else { // Some error handling is here. $registerError = 'The e-mail address you entered is already in use.'; } } // the elseif, elseif, and else are more error handling. elseif ($email != $email2) { $registerError = 'Your e-mails did not match'; } elseif ($password != $password2) { $registerError = 'Passwords didn\'t match.'; } else { $registerError = 'Filled out completely?'; } // If the registration was submitted, but had errors, this will print the form again. if (!isset($_SESSION['registrationComplete'])) { require_once REF_DIR . REF_REGISTERFORM; } // IMPORTANT! it turns out my code did not work, I forgot I had the same statement elsewhere. else { echo 'Congratulations, Foo! Go to *link to Bar*.'; } } // Creates form. else { require_once REF_DIR . REF_REGISTERFORM; } } 

Это сводилось к основам отладки / устранения неполадок.

  1. Понимайте как можно больше о методе / библиотеке / функции / том, что вы пытаетесь использовать.
  2. Осмотрите отличительные биты и убедитесь, что они – то, что вы ожидаете или что они должны быть. (Между этими двумя есть небольшая разница, в зависимости от ситуации.)
  3. Если это не приведет вас к решению, отступите и убедитесь, что вы понимаете ситуацию. Это может означать упрощение, так что вы имеете дело только с проблемой, т. Е. Создаете отдельный, более простой тестовый пример, который раскрывает ту же проблему. Или это может просто означать, что вы прекращаете кодирование и работаете через поток вашего кода, чтобы убедиться, что он действительно делает то, что, по вашему мнению, делает.

Типичная проблема с сессиями, которые не работают, – это забыть использовать session_start() (рядом или вверху) любой страницы, использующей сеансы.

Один из моих любимых фрагментов кода PHP для отладки:

 print '<pre>'; var_dump($some_variable); print '</pre>'; 

Я пытаюсь использовать print для отладки и echo для регулярного вывода. Это упрощает определение кода отладки, когда он выходит за рамки нескольких тривиальных битов вывода.

Между тем, var_dump напечатает немного больше информации об этой переменной, например, ее тип и размер. Важно обернуть его в <pre></pre> чтобы было легче читать результат.

Пытаться

 if (!empty($_SESSION['registrationComplete'])) { 

Если вы получите предупреждение после того, как сообщение будет напечатано, это не может произойти из эха, поскольку в соответствии с вашим кодом он будет выброшен перед печатью этого сообщения. Вы уверены, что не используете $ _SESSION ['registrationComplete'] за пределами оператора if? Попробуйте добавить exit или die () перед закрывающей скобкой if и посмотреть, исчезнет ли уведомление.