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. Не могу понять как пофиксить.
  • Вопрос задан
  • 126 просмотров
Решения вопроса 1
@D3lphi
Потому что куки устанавливаются по средствам отправки заголовков ответа. Заголовки отправляются перед тем, как вы выводить что-то (через echo, например). $_COOKIE же в свою очередь заполняется при получении заголовков запроса. То есть, до начала выполнения кода. Таким образом, получается, что этот массив во время выполнения скрипта первый раз пуст.

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

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

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

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

Похожие вопросы