Как указать новый идентификатор сеанса каждый раз, когда я обновляю домашнюю страницу, но сохранить один и тот же идентификатор сеанса между всеми страницами?

Я хочу давать новый идентификатор сеанса каждый раз, когда обновляю домашнюю страницу, и получаю тот же идентификатор сеанса при переходе на другие страницы, но тот же идентификатор сеанса сохраняется, когда я возвращаюсь на домашнюю страницу. Я не хочу использовать встроенный $_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 как строка и не выполняет ее, ваш вызов функции внутри нее является избыточным. ты хотел include 'home.php'; ?

Scuzzy 20.03.2022 23:54

Я использовал file_get_contents() для чтения home.php, а затем заменил '---session-id---' на session-_id().

Shaza Alkharat 21.03.2022 00:17

Проблема в том, что когда я нахожусь на второй странице и хочу вернуться на главную страницу, идентификатор сеанса на главной странице меняется. Я хочу, чтобы идентификатор менялся только при обновлении страницы

Shaza Alkharat 21.03.2022 00:23

Я не думаю, что со стороны сервера можно определить, была ли страница обновлена ​​или открыта с подстраницы. Проверка заголовка реферера не гарантирует надежность.

vanowm 21.03.2022 00:29

Одним из возможных способов может быть сохранение последней открытой страницы в файле cookie (или базе данных на сервере), и если она соответствует текущей странице, это означает, что страница была обновлена.

vanowm 21.03.2022 00:36

Согласно коду, который я прикрепил к вопросу, мне удалось изменить идентификатор сеанса каждый раз, когда я обновлял страницу без каких-либо проблем. @vanowm

Shaza Alkharat 21.03.2022 00:41

@ShazaAlkharat, но создание нового идентификатора сеанса здесь не проблема, не так ли?

vanowm 21.03.2022 00:45

Нет, это не проблема. Проблема заключается в том, чтобы сохранить один и тот же идентификатор сеанса на всех страницах при перемещении между ними и изменить его только при обновлении домашней главной страницы.

Shaza Alkharat 21.03.2022 00:51

Я так и не понял, в чем смысл сброса идентификатора сеанса на главной странице? Какого результата вы хотите добиться, сбросив сеанс?

Scuzzy 21.03.2022 05:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
9
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот два разных способа сделать это (сеансы и файлы 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

Shaza Alkharat 21.03.2022 01:00

@ShazaAlkharat Но... почему?

ceejayoz 21.03.2022 01:11

@ShazaAlkharat Я добавил новое решение с использованием файлов cookie. Надеюсь, это поможет.

RyDog 21.03.2022 01:36

Большое тебе спасибо. Использование файлов cookie помогло мне :) @RyDog

Shaza Alkharat 21.03.2022 13:48

@ShazaAlkharat, не могли бы вы отметить это как принятый ответ, если это помогло?

RyDog 21.03.2022 22:21

Другие вопросы по теме