Я хочу давать новый идентификатор сеанса каждый раз, когда обновляю домашнюю страницу, и получаю тот же идентификатор сеанса при переходе на другие страницы, но тот же идентификатор сеанса сохраняется, когда я возвращаюсь на домашнюю страницу. Я не хочу использовать встроенный $_SESSION в этом вопросе. Мне удалось указать случайный идентификатор сеанса на домашней странице, когда я обновляю страницу, написав session_id(rand()) перед session_start() в index.php. Мне также удалось получить тот же идентификатор сеанса на других страницах. Моя проблема в том, что когда я вернулся на домашнюю страницу, идентификатор сеанса изменился.
Что мне делать, чтобы сохранить тот же идентификатор сеанса при возврате на домашнюю страницу с одной из второстепенных страниц?
Мой код:
домашний.php:
<?php
session_start();
?>
<!DOCTYPE html>
<html lang = "en">
<body>
<p>Random session ID (---session-id---). Reload the page to create a new session ID.</p>
<a href = "link.php"> First link </a> <br>
<a href = "link.php"> Second link </a> <br>
<form action = "info.php" method = "Post">
<input type = "hidden" name = "session-id" value = "---session-id---">
Name: <input type = "text" name = "name"> <br> <br>
<input type = "submit" name = "submit" value = "Send">
</form>
</body>
</html>
index.php
<?php
session_id(rand());
session_start();
$html = file_get_contents('home.php');
$html = str_replace('---session-id---', session_id(), $html);
echo $html;
?>
ссылка.php
<?php
session_start();
echo "session-id = " . session_id();
Я использовал file_get_contents() для чтения home.php, а затем заменил '---session-id---' на session-_id().
Проблема в том, что когда я нахожусь на второй странице и хочу вернуться на главную страницу, идентификатор сеанса на главной странице меняется. Я хочу, чтобы идентификатор менялся только при обновлении страницы
Я не думаю, что со стороны сервера можно определить, была ли страница обновлена или открыта с подстраницы. Проверка заголовка реферера не гарантирует надежность.
Одним из возможных способов может быть сохранение последней открытой страницы в файле cookie (или базе данных на сервере), и если она соответствует текущей странице, это означает, что страница была обновлена.
Согласно коду, который я прикрепил к вопросу, мне удалось изменить идентификатор сеанса каждый раз, когда я обновлял страницу без каких-либо проблем. @vanowm
@ShazaAlkharat, но создание нового идентификатора сеанса здесь не проблема, не так ли?
Нет, это не проблема. Проблема заключается в том, чтобы сохранить один и тот же идентификатор сеанса на всех страницах при перемещении между ними и изменить его только при обновлении домашней главной страницы.
Я так и не понял, в чем смысл сброса идентификатора сеанса на главной странице? Какого результата вы хотите добиться, сбросив сеанс?
Вот два разных способа сделать это (сеансы и файлы cookie):
Вы можете использовать сеанс, установив переменную сеанса в верхней части ваших подстраниц, а затем проверьте, существует ли переменная сеанса на вашей домашней странице. если сеансовая переменная существует, отключите ее, а если нет, то сгенерируйте новый случайный идентификатор сеанса.
попробуй это
home.php
<?php
session_start();
?>
<!DOCTYPE html>
<html lang = "en">
<body>
<p>Random session ID (---session-id---). Reload the page to create a new session ID.</p>
<a href = "link.php"> First link </a> <br>
<a href = "link.php"> Second link </a> <br>
<form action = "info.php" method = "Post">
<input type = "hidden" name = "session-id" value = "---session-id---">
Name: <input type = "text" name = "name"> <br> <br>
<input type = "submit" name = "submit" value = "Send">
</form>
</body>
</html>
index.php
<?php
session_start(); //start the session so we can check if there are any session vars set
if (isset($_SESSION['page'])){ //the last page was a subpage
unset($_SESSION['page']); //unset the session var so if the page is refreshed it will give a new session id
}else{ // last page was homepage.
session_destroy(); //destroy the session so we can create a new session with random ID
session_id(rand());
session_start();
}
$html = file_get_contents('home.php');
$html = str_replace('---session-id---', session_id(), $html);
echo $html;
?>
ссылка.php
<?php
session_start();
$_SESSION['page'] = true; //set a session var to show a sub page has been visited
echo "session-id = " . session_id();
?>
Вы можете использовать файлы cookie, обновив значение файла cookie в зависимости от того, какую страницу вы посетили, а затем проверьте значение файла cookie на главной странице, чтобы узнать, была ли последняя страница домашней страницей.
попробуй это:
home.php
<?php
session_start();
?>
<!DOCTYPE html>
<html lang = "en">
<body>
<p>Random session ID (---session-id---). Reload the page to create a new session ID.</p>
<a href = "link.php"> First link </a> <br>
<a href = "link.php"> Second link </a> <br>
<form action = "info.php" method = "Post">
<input type = "hidden" name = "session-id" value = "---session-id---">
Name: <input type = "text" name = "name"> <br> <br>
<input type = "submit" name = "submit" value = "Send">
</form>
</body>
</html>
index.php
<?php
//check to see if a cookie has been set and to see if it has the value of home
if (!isset($_COOKIE["page"]) || $_COOKIE["page"] == 'home'){
//last page was the home page or the cookie was not set.
session_id(rand());
}else{ //last page visted was not the home page, update the cookie
setcookie("page", 'home');
}
session_start();
$html = file_get_contents('home.php');
$html = str_replace('---session-id---', session_id(), $html);
echo $html;
?>
ссылка.php
<?php
session_start();
setcookie("page", 'not-home'); //set a cookie to say this is not homepage
echo "session-id = " . session_id();
?>
Это работает, но я ищу решение без использования глобальной переменной $_SESSION
@ShazaAlkharat Но... почему?
@ShazaAlkharat Я добавил новое решение с использованием файлов cookie. Надеюсь, это поможет.
Большое тебе спасибо. Использование файлов cookie помогло мне :) @RyDog
@ShazaAlkharat, не могли бы вы отметить это как принятый ответ, если это помогло?
Почему? Я не понимаю, какую проблему вы пытаетесь решить. Редактировать: также
file_get_contents()
читаетсяhome.php
как строка и не выполняет ее, ваш вызов функции внутри нее является избыточным. ты хотелinclude 'home.php';
?