Помогите внести ясность в простом вопросе, изучаю php, не могу понять одну простую вещь с переходом по адресу в теге action.
Делаю так, в файле auth.php проверяю пустой инпут или нет, если нет старную сессию и добавляю в гл.массив auth =true
//auth.php
if (!empty($_REQUEST['test'])) {
session_start();
$_SESSION['auth'] = true;
} else {
echo 'Пустой инпут';
?>
<form action="" method="get">
<input name="test">
<input type="submit" value="SEND">
</form>
<?php
}
Захожу во второй файл index.php и проверяю, выводится true, сессия работает на этом этапе все понятно.
//index.php
session_start(); //стартуем сессию
if (!empty($_SESSION['auth'])) { echo 'true'} else { echo 'false'; }
Но если я в файле auth.php в теге action прописываю action="index.php", то при перенаправлении на index.php получаю false.
Я так понимаю это связано с тем, что в первом случае файл auth.php считывается два раза и в итоге стартует сессию и В $_SESSION['auth'] пишет true, а втором случае повторное считывание не происходит и идет перенаправление сразу в index.php, где по сути $_SESSION['auth'] вовсе нет.
Как быть в такой ситуации не могу понять
Происходит все корректно, в первом случае:
auth.php, заполняете поле, жмете кнопку отправкиaction браузер отправляет запрос к текущему скрипту, то есть опять auth.php, условие выполняется, в сессию записывается нужное значение.index.php, нужное значение уже в сессииво втором случае вы исправляете action на index.php поэтому при отправке формы запрос уходит именно туда. Никакие параметры формы уже не проверяются, в сессию ничего не записывается, т.к. скрипт обработки формы стал другим.
Если вам необходимо после проверки данных формы переправить пользователя на другой скрипт, то обработчик формы следует оставить пустым (или явно auth.php), а после указания значений сессии программно перенаправить запрос на другой файл
....
$_SESSION['auth'] = true;
header("Location: index.php");
exit();
При этом будет сформирован HTTP ответ с кодом 302, сервер отправит браузеру новый URL, по которому браузер автоматически и перейдет.
Перед вызовом header не должно быть никакого другого вывода данных, либо придется очистить буфер вывода с помощью ob_clean
У вас есть три файла (некоторые файлы могут быть объединены в один)
А дальше все просто
session_start()В файле обработчики формы (тот который указан в атрибуте action) должна осуществляться проверка полей формы и устанавливаться или сбрасываться флаг аутентификации
if (password_valid())
$_SESSION['auth'] = true;
else
unset($_SESSION['auth']);
При необходимости проверить аутентификацию в любом месте программы, должен выполняться код
if (isset($_SESSION['auth']))
empty — Проверяет, пуста ли переменная. Если вы не создавали $_SESSION['auth'] то будет ошибка. Проверяйте существование isset($_SESSION['auth'])
файл index.php
session_start();
// если есть сесия
if(isset($_SESSION['auth'])){
echo 'true';
}
// иначе - подключаем форму
else{
include 'auth.php';
}
файл auth.php
// Если есть переданный из формы пароль
if (isset($_POST['password'])) {
$_SESSION['auth'] = true;
} else {
// иначе выводим форму
echo 'Пустой инпут';
// не передавайте пароли в адресной строке. это плохая практика.
// Также првоеряйте имена передаваемых и получаемых переменных. Если передаём пароль то и получать должны пароль.
// Вы же передавали поле с именем test, а пытались получить $_REQUEST['password']
?>
<form action="" method="post">
<input name="password">
<input type="submit" value="SEND">
</form>
<?php
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей