Неправильное перенаправление пользователя обратно на страницу PHP после отправки формы - PullRequest
0 голосов
/ 07 октября 2010

All

Этот вопрос, вероятно, имеет очень простой ответ - то, что я пропускаю. Но, может быть, кто-то может сказать мне, где искать ...

У меня есть страница PHP («index.php») с очень простой формой входа (например, имя пользователя и пароль).

Когда пользователь нажимает кнопку «Отправить», форма отправляет значения на другую страницу PHP («login.php»). Эта страница должна подтвердить учетные данные пользователя, а затем сделать следующее:

  • Если учетные данные пользователя не указаны правильно, перенаправить пользователя на error.php вместе с ошибкой Сообщение
  • Если учетные данные пользователя являются исправить, создать сеанс и установить $ _SESSION ['authenticated'] = true, а затем перенаправить его в «loggedin.php»

[UPDATE]

Затем в loggedin.php я проверяю, что isset ($ _ SESSION ['authenticated]]) возвращает true. Если это так, тогда продолжайте. Если нет, перенаправьте пользователя обратно на index.php.

Однако вот что происходит. FIRST время, когда я заполняю форму (с действительными кредитами) и отправляю ее, я могу кратко увидеть в строке URL, что пользователь отправляется в login.php, затем loggedin.php, но затем НАЗАД в index.php.

Но, если я повторно введу те же самые учетные данные и отправлю информацию в SECOND раз, все будет работать точно так, как и должно.

Короче говоря, похоже, что либо login.php не устанавливает переменную $ _SESSION с первого раза, либо она не установлена, но по какой-то причине она не устанавливается, когда я проверяю ее впервые при входе в систему. .php

Существует ли некоторая задержка между установкой переменной в login.php и возвращением isset () значения true в loggedin.php?

Или, я что-то не так делаю?

Вот соответствующие (я думаю) фрагменты кода:

В login.php:

session_start();
$_SESSION['authenticated'] = true;
header('Location: http://www.mydomain.com/loggedin.php');

В loggedin.php:

session_start();
$authenticated = $_SESSION['authenticated'];
if (!isset($authenticated)) {
    header('Location: http://www.footballpoolz.com/mobile/index.php');
    die();
}

Заранее большое спасибо за любые советы или идеи!

Ура, Мэтт Стюлер

Ответы [ 3 ]

1 голос
/ 07 октября 2010

Мне кажется, я знаю причину ошибки.Сеанс должен быть связан с браузером и IP-адресом (таким образом, одновременно может быть зарегистрировано более одного человека).Это означает, что сеанс должен быть не только сохранен на стороне сервера, но и клиент должен иметь ссылку на сеанс, чтобы вы знали, кто вошел в систему, как при запросе данных.Этот идентификатор сеанса является частью заголовка во всех HTTP-запросах.

Однако, когда вы перенаправляете пользователя, вы не даете ему возможность отправлять новые заголовки, не так ли?Вы, вероятно, просто отправляете им новую страницу.Эта новая страница никогда не видела заголовок от них, поэтому она не знает, какая переменная сеанса (PHP имеет сотни или даже тысячи переменных сеанса) принадлежит им.При повторном входе в систему во второй раз вы отправляете заголовок и, таким образом, отправляете идентификатор сеанса, и PHP знает, какая переменная сеанса является вашей.

Существует два решения.Во-первых, найти способ перенаправить их, который заставляет их отправлять новый заголовок.Я верю, что использование header("Location: www.mysite.com/newpage.php"); сделает это.Я могу ошибаться.

Альтернативой является временная передача идентификатора сеанса при перенаправлении их в loggedin.php, чтобы вы знали, что они вошли для загрузки первой страницы.После начальной загрузки страницы вам больше не нужно делать этот дополнительный шаг, поскольку он будет выполняться для вас каждый раз, когда они запрашивают страницу.Чтобы передать идентификатор сеанса, вы просто добавляете ?SID=... к вашему перенаправлению.

http://www.php.net/manual/en/session.idpassing.php

0 голосов
/ 07 октября 2010

Вместо использования этого true. Попробуйте поставить какое-то значение.

как $ _SESSION ['username'] = 'mattstuehler'

и чек

$ loggeduser = $ _ SESSION [ 'имя пользователя']; если (! пусто ($ loggeduser))

Я все равно не вижу никаких ошибок

0 голосов
/ 07 октября 2010

Перенаправления действительно замедляют работу и вызывают дополнительную нагрузку на сервер.То, что вы должны сделать, это отправить обратно на страницу index.php, которая обнаружит, есть ли POST или нет.Затем войдите в систему и отобразите содержимое файла loggedin.php.Перенаправления не нужны.

В конце концов, вы уже знаете, что пользователь прошел валидацию, зачем перенаправлять его на другую страницу, где вы должны снова проверить валидацию (что вы только что сделали)?Это больше концепция «Front Controller», где ваш index.php действует как маршрутизатор для загрузки и отображения различных страниц.Даже если это просто страница приветствия при входе в систему.Это устраняет любые проблемы с задержками.

Вы делаете session_start, верно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...