PHP: Примечание: неопределенный индекс, где определена переменная сеанса - PullRequest
0 голосов
/ 27 июля 2010

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

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

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

/* 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>';

}

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

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

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

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

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

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; }

}

Ответы [ 3 ]

3 голосов
/ 29 июля 2010

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

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

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

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

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

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

0 голосов
/ 27 июля 2010

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

0 голосов
/ 27 июля 2010

Попробуйте

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