#php #session
#php #сеанс
Вопрос:
В приложении, которое я разрабатываю, у меня ошибка, из-за которой я перенаправляю свой браузер на index.php , а затем правильно перенаправляется на login.php если текущего сеанса нет. Моя проблема в том, что после ввода правильных данных на login.php и нажмите кнопку отправить, я связан с другим login.php экран (вместо возврата к index.php с активным сеансом) и требуется снова ввести мои данные. Первый экран имеет то же форматирование CSS, что и index.php , в то время как на втором экране этого нет.
После ввода моих данных на втором экране и нажатия кнопки войти сеансы, похоже, функционируют нормально. Кроме того, много раз мне будет представлен один экран входа в систему, будет отображаться неправильный вход в систему и правильные данные главного экрана пользователя (что требует успешных запросов к данным входа), но если я перейду от index.php на другой экран, требующий активного сеанса, будет выведен неформатированный login.php экран.
Если я выхожу из системы, перехожу на другую страницу без ограничений и пытаюсь снова войти в систему в том же сеансе браузера, вход в систему корректно работает только на одном экране.
Вот фрагменты из соответствующих файлов:
index.php
<?php
include_once 'db_functions.php';
require_once 'access.php';
if (isset($_POST['action'])) {
if (userIsLoggedIn()) {
header('Location: http://www.myapp.com/index.php'); //prevents users from having to confirm form resubmission if they refresh the page
}
}
if (!userIsLoggedIn()) {
include 'login.php';
exit();
}
login.php:
login.php
<body>
<h1>Log In</h1>
<?php
if (isset($loginError)) {
echo $loginError;
}
?>
<form action="" method="post">
<div>
<label for="email">Email: <input type="text" name="email" id="email" /> </label>
</div>
<div>
<label for="password">Password: <input type="password" name="password" id="password" /></label>
</div>
<div>
<input type="hidden" name="action" value="login" />
<input type="submit" value="Log in" />
</div>
</form>
</body>
access.php:
<?php
function userIsLoggedIn() {
if (isset($_POST['action']) and $_POST['action'] == 'login') {
if (!isset($_POST['action']) or $_POST['email'] == '' or
!isset($_POST['password']) or $_POST['password'] == '') {
$GLOBALS['loginError'] = 'Please fill in both fields';
return FALSE;
}
$email = $_POST['email'];
$password = $_POST['password'];
if (databaseContainsAuthor($email, $password)) {
session_start(); //LINE 17
$_SESSION['loggedIn'] = TRUE;
$_SESSION['email'] = $email;
$_SESSION['password'] = $password;
return TRUE;
}
else {
session_start();
unset($_SESSION['loggedIn']);
unset($_SESSION['email']);
unset($_SESSION['password']);
$GLOBALS['loginError'] = 'The specified email address or password was incorrect.';
return FALSE;
}
}
if (isset($_POST['action']) and $_POST['action'] == 'logout') {
session_start();
unset($_SESSION['loggedIn']);
unset($_SESSION['email']);
unset($_SESSION['password']);
header('Location: ' . $_POST['goto']);
exit();
}
session_start();
if (isset($_SESSION['loggedIn'])) {
return databaseContainsAuthor($_SESSION['email'], $_SESSION['password']);
}
}
function databaseContainsAuthor($email, $password) {
include_once './db_functions.php';
$db = new DB_Functions();
$result = $db->accountExists($email, $password);
return $result;
}
?>
Любая помощь будет принята с благодарностью!
ОБНОВЛЕНИЕ: журналы ошибок показывают несколько случаев возникновения этой ошибки:
PHP Notice: A session had already been started - ignoring session_start() in /home3/monitot5/public_html/app/access.php on line 17
Access.php строка 17:
if (databaseContainsAuthor($email, $password)) {
session_start(); //LINE 17
$_SESSION['loggedIn'] = TRUE;
Комментарии:
1. Вы должны вызывать
session_start()
ровно один раз за запрос — не больше и не меньше. Это не должно быть вif
/else
structures или скрыто в функции, но вызывается в верхней части скрипта.
Ответ №1:
Что вам нужно сделать, так это использовать
session_start();
в начале access.php
файла и больше не используйте эту функцию.
Вы также должны полностью изменить логин вашего access.php
файла. Первое, что вы всегда должны делать в этом файле, это проверять, существует ли допустимый сеанс для этого пользователя. Теперь вы проверяете это в конце файла и, вероятно, раньше очищаете его, потому что вы отменяете сеанс, если нет $_POST
данных.
Кроме того, вы также не должны использовать пароль в своем сеансе. Это довольно небезопасно. Вы должны просто сохранить логин для своей системы, когда пользователь заполнил форму действительным именем пользователя / электронной почтой и паролем, и отменить его, если пользователь вышел из системы.
Извините, но я не буду писать весь код за вас. Вы должны просто взглянуть на некоторые примеры кода в Google, чтобы проверить, как обрабатывать вход / выход пользователя в PHP.