Я делаю систему регистрации с верификатором электронной почты. Ваш типичный «использовать этот код для проверки» типа вещи.
Я хочу, чтобы переменная сеанса сохранялась, поэтому, когда люди завершают регистрацию своей учетной записи на странице регистрации и каким-то образом возвращаются на страницу при аварии, она напоминает им, что им необходимо активировать свою учетную запись перед использованием.
Что затрудняет диагностику этой проблемы, так это то, что я использовал многие другие переменные сеанса аналогичным образом, но этот не работает вообще. Вот мой подход:
/* 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; } }
Это сводилось к основам отладки / устранения неполадок.
Типичная проблема с сессиями, которые не работают, – это забыть использовать 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 и посмотреть, исчезнет ли уведомление.