PHP setcookie () не работает после сброса $ _COOKIE - PullRequest
0 голосов
/ 03 января 2011

Я только что написал очень простой класс-обертку для Cookies, который выглядит следующим образом:

<?php
class Cookie {  

    // expire time of the cookie 31 days
    private static $_expire = '2678400';

    public static function set($name = null, $value = null, $expire = null) {
        if (!empty($name)) {
            $expire = !empty($expire) ? $expire : time() + self::$_expire;
            if (setcookie($name, $value, $expire)) {
                return true;
            }
            return false;
        }
        return false;
    }

    public static function get($name = null) {
        if (!empty($name)) {
            return !empty($_COOKIE[$name]) ? $_COOKIE[$name] : false;
        }
        return false;
    }      

    public static function remove($name = null) {
        if (!empty($name)) {
            if (!empty($_COOKIE[$name])) {
                if (setcookie($name, false, time() - self::$_expire)) {
                    unset($_COOKIE[$name]);
                    return true;
                }
                return false;
            }
            return true;
        }
        return false;
    }

}
?>

Однако у меня есть проблема, когда cookie был изначально установлен, затем я хочу изменить значение, сначала вызвав:

Cookie::remove('session_name');

, а затем

Cookie::set('session_name');

Второй (установленный) не устанавливает cookie.

Есть идеи, что может быть причиной этого?

Ответы [ 3 ]

3 голосов
/ 03 января 2011

Я думаю, вы неправильно понимаете, как работают куки.

Содержимое $_COOKIE устанавливается один раз , когда приходит HTTP-запрос и до того, как ваш скрипт начинает выполнение.

Если вы используете setcookie для добавления или изменения файла cookie, это добавление или изменение не будет отображаться до тех пор, пока HTTP-запрос следующий не будет отправлен на ваш сервер.Это то, что вы делаете в своем методе Cookie::set.

Если вы "тестируете" Cookie::set, просматривая содержимое $_COOKIE (или используя Cookie::get, который делает то же самое) тогда вы не увидите изменения в файле cookie , даже если они были сделаны .

Чтобы увидеть, что вы ожидаете, вы должны добавить значение к $_COOKIE внутри Cookie::set.Однако я бы предложил написать вашу программу по-другому.Вы пытаетесь использовать файлы cookie, как обычные переменные, а они - нет.

1 голос
/ 03 января 2011

Если вы хотите изменить значение файла cookie, нет необходимости сначала удалять его, вы можете позвонить прямо Session::set('session_name');, и файл cookie будет перезаписан. Звоните Session::remove('session_name'); только тогда, когда вам больше не нужны файлы cookie.

0 голосов
/ 03 января 2011

если я вас правильно понял, вам нужно что-то подобное

public static function set($name, $value,$expire) 
{
    setcookie($name, $value, $expire);

   $_COOKIE[$name] = $value;    

}
...