leni_m
@leni_m
ЧупаКобрус

Как работать с куки?

html
<form id="test">
    ...
</form>
<div id="test2"></div>
<script>
    $('#test').on('submit', function () {
        var params = $(this).serialize();

        $.ajax({
            type: "POST",
            url: "index.php",
            data: params,
            headers: {
                'Cookie': document.cookie
            }
        })
            .done(function(msg) {
                $('#test2').html(msg);
            });
        return false;
    });
</script>

index.php
<?php setcookie ('test', '1', time() + 60*60*24);
        echo $_COOKIE['test'];

Почему ajax возвращает куки только на втором разе(т.е. куки запаздывает на 1 ajax запрос)?
Т.е. в данном случае при первой отправке ajax возвращает "Notice: Undefined index: test in ... ", а уже при второй отправке вернет "1".
Не могу понять, вроде бы сначала устанавливаем куки setcookie а потом выводим её
echo $_COOKIE. Не могу понять как пофиксить.
  • Вопрос задан
  • 125 просмотров
Решения вопроса 1
@D3lphi
Потому что куки устанавливаются по средствам отправки заголовков ответа. Заголовки отправляются перед тем, как вы выводить что-то (через echo, например). $_COOKIE же в свою очередь заполняется при получении заголовков запроса. То есть, до начала выполнения кода. Таким образом, получается, что этот массив во время выполнения скрипта первый раз пуст.

Получается такая схема:

Первое выполнение скрипта:
1) Приходят заголовки запроса (Куки отсутствуют)
2) куки отсутствуют -> массив $_COOKIE пуст
3) Устанавливаем куки (массив $_COOKIE все еще пуст)
4) Отправляем заголовки ответа (массив $_COOKIE пуст), устанавливаем куки на клиенте

Второе выполнение скрипта:
1) Приходят заголовки запроса -> в них уже есть куки.
2) $_COOKIE теперь содержат то, что мы установили во время выполнения предыдущего скрипта.
...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
28 мар. 2024, в 18:16
1000 руб./за проект
28 мар. 2024, в 18:15
90000 руб./за проект
28 мар. 2024, в 18:05
5000 руб./за проект