Установка js cookie и доступ к нему с помощью php на той же странице – неопределённый до обновления страницы.

Вопрос или проблема

Возможно ли установить этот cookie с помощью JavaScript, а затем получить к нему доступ позже в теле с помощью PHP? Не имеет значения, где я помещаю свой script, когда я вызываю его с помощью PHP, он всегда неопределен, пока я не обновлю страницу. Я могу разместить его в шапке, выше HTML и т.д., это не имеет значения. То, что я хочу достичь, это наличие установленного cookie для использования на моей странице – с помощью PHP – без необходимости обновления. Примером может служить первый визит пользователя на мой сайт. session.php – это то, что запускает сессию.

test.php :

<?php
require $_SERVER['DOCUMENT_ROOT'].'/assets/functions/session.php';
?>

<!DOCTYPE html>
<html class="no-js" lang="en">

<!-- НАЧАЛО ШАПКИ -->
<head>
    <script>
            // возвращает временную зону браузера или по умолчанию UTC
            var tz = Intl.DateTimeFormat().resolvedOptions().timeZone ?? 'UTC';

            // сохраняем как cookie, чтобы использовать его с PHP
            //document.cookie = "test_Timezone="+tz+"; expires=0; path=/; domain=test.com; secure; samesite=lax";
            document.cookie = "test_Timezone="+tz+"; expires=0; path=/; domain=test.bs5; samesite=lax";

    </script>
</head>
<!-- Конец ШАПКИ -->

<!-- НАЧАЛО ТЕЛА -->
<body>

    <?php
        echo 'временная зона: '.$_COOKIE['test_Timezone'];
    ?>
</body>
<!-- КОНЕЦ ТЕЛА -->
</html>

Код на стороне сервера (PHP в вашем случае) выполняется до того, как выполняется скрипт на стороне клиента; поэтому вы пытаетесь получить информацию о cookie, которая еще не была сохранена.

Вы можете сделать одно из следующего:

  1. Использовать PHP для установки cookie, вам больше не нужно полагаться на JS, чтобы получить содержимое в том же скрипте
  2. Создать страницу-перенаправление, где вы устанавливаете cookie с помощью JS (если это необходимо), а затем перенаправляете на PHP-скрипт, который получит установленные содержимое cookie из перенаправления
  3. Вы можете сделать AJAX-запрос для установки cookie внутри вашей страницы, чтобы задать cookie в отдельном скрипте, и при успешном вызове установить ваши геттеры

Это некоторые креативные способы, которые могут решить вашу проблему.

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

Процесс следующий:

  • клиент отправляет запрос на сервер
  • сервер подтверждает запрос клиента
  • поэтому он выполнит ваш PHP
  • и сгенерирует HTML
  • и продолжит отправлять ваш HTML клиенту
  • клиент получает HTML, анализирует его
  • и затем отображает его, а также выполняет ваш программный код

Таким образом, ваш сервер уже выполнит ваш PHP к тому моменту, когда ваш клиент должен будет выполнить ваш JavaScript, независимо от того, где вы разместили свой скрипт текстуально. Если вам нужно сохранить cookie и продолжить использовать его внутри PHP, тогда вам нужно отправить запрос на ваш сервер. Для этой цели вы можете проверить isset($_COOKIE['test_Timezone']), и если это истинно, тогда отображайте его. Если это не так, тогда перезагрузите страницу.

Ответ или решение

Вопрос о том, как установить cookie с помощью JavaScript и затем получить его в PHP без необходимости обновления страницы, затрагивает важные аспекты работы клиент-серверной архитектуры.

Объяснение проблемы

Когда вы запрашиваете страницу, сервер сначала выполняет PHP-код, а затем возвращает HTML-контент клиенту. Следовательно, любой cookie, установленный с помощью JavaScript, не будет доступен в PHP до следующего запроса страницы или обновления. Это связано с тем, что JavaScript на клиентской стороне выполняется после того, как PHP на серверной стороне уже завершил свою работу и сгенерировал HTML.

Возможные решения

  1. Установить cookie на стороне PHP: Если вам не обязательно использовать JavaScript для установки cookie, вы можете установить cookie напрямую из PHP с помощью функции setcookie(). Это позволяет получить значение cookie сразу после его установки.

    <?php
    setcookie("test_Timezone", "UTC", time() + 3600, "/", "test.bs5", true, true);
    echo 'timezone is : '.$_COOKIE['test_Timezone'];
    ?>
  2. Использовать переадресацию (redirect): Вы можете установить cookie с помощью JavaScript, а затем перенаправить пользователя на ту же страницу. Это позволит серверу обработать новый запрос, и в PHP будет доступен установленный cookie.

    <script>
        var tz = Intl.DateTimeFormat().resolvedOptions().timeZone ?? 'UTC';
        document.cookie = "test_Timezone="+tz+"; expires=0; path=/; domain=test.bs5; samesite=lax";
        window.location.reload(); // обновим страницу
    </script>
  3. Использовать AJAX-запрос: Вы можете отправить AJAX-запрос для установки cookie на сервере и обновления контента страницы. Это потребует дополнительного PHP-скрипта, который будет обрабатывать AJAX-запрос и устанавливать cookie.

    var tz = Intl.DateTimeFormat().resolvedOptions().timeZone ?? 'UTC';
    fetch('set_cookie.php', {
        method: 'POST',
        body: JSON.stringify({ timezone: tz }),
        headers: {
            'Content-Type': 'application/json'
        }
    })
    .then(response => response.json())
    .then(data => {
        if (data.success) {
            location.reload(); // обновим страницу
        }
    });

    В set_cookie.php вам нужно установить cookie:

    <?php
    $data = json_decode(file_get_contents('php://input'), true);
    if (isset($data['timezone'])) {
        setcookie("test_Timezone", $data['timezone'], time() + 3600, "/", "test.bs5", true, true);
        echo json_encode(['success' => true]);
    } else {
        echo json_encode(['success' => false]);
    }
    ?>

Заключение

Как видно, решение вашего вопроса зависит от ваших требований к работе с клиентскими данными и HTML. Установив cookie с помощью PHP или используя подходы с переадресацией и AJAX, вы можете успешно избежать необходимости обновления страницы для доступа к значениям cookie в PHP.

Оцените материал
Добавить комментарий

Капча загружается...