복붙노트

setcookie () 후 즉시 $ _COOKIE에 액세스

PHP

setcookie () 후 즉시 $ _COOKIE에 액세스

PHP에서 setcookie () 함수를 호출 한 직후에 쿠키 값 ($ _COOKIE 사용)에 액세스하려고합니다. 그렇게하면 $ _COOKIE [ 'uname']이 설정되지 않습니다. 왜?

그러나 $ _COOKIE [ 'uname']는 다음에 스크립트를 실행할 때 (예 : 페이지를 새로 고친 후) 예상대로 설정됩니다.

setcookie('uname', $uname, time() + 60 * 30);
echo "Cookie value: " . $_COOKIE['uname'];

해결법

  1. ==============================

    1.$ _COOKIE는 웹의 상태를 알 수 없으므로 페이지가로드 될 때 설정됩니다. 즉각적인 액세스를 원할 경우 $ _COOKIE [ 'uname']을 직접 설정하거나 중간 변수를 사용할 수 있습니다.

    $ _COOKIE는 웹의 상태를 알 수 없으므로 페이지가로드 될 때 설정됩니다. 즉각적인 액세스를 원할 경우 $ _COOKIE [ 'uname']을 직접 설정하거나 중간 변수를 사용할 수 있습니다.

    예 :

    if (isset($_COOKIE['uname'])) {
        // get data from cookie for local use
        $uname = $_COOKIE['uname'];
    }
    else {
        // set cookie, local $uname already set
        setcookie('uname', $uname, time() + 1800);  
    }
    
  2. ==============================

    2.쿠키는 응답이 클라이언트로 되돌려 보내질 때까지 설정되지 않으며, 그 후에 클라이언트로부터의 다음 요청이있을 때까지는 PHP에서 사용할 수 없습니다.

    쿠키는 응답이 클라이언트로 되돌려 보내질 때까지 설정되지 않으며, 그 후에 클라이언트로부터의 다음 요청이있을 때까지는 PHP에서 사용할 수 없습니다.

    그러나 스크립트에 쿠키를 설정하면 다음을 수행 할 수 있습니다.

    setcookie('uname', $uname, time()+60*30);
    $_COOKIE['uname'] = $uname;
    
  3. ==============================

    3.setcookie ()를 호출 한 직후에 쿠키 값에 액세스하려면 $ _COOKIE를 사용할 수 없습니다. 그 이유는 프로토콜의 특성 때문입니다 (https://tools.ietf.org/html/rfc6265 참조). setcookie ()를 사용할 때 나머지 HTTP 헤더와 함께 클라이언트로 보낼 쿠키를 정의합니다 (http://php.net/manual/en/function.setcookie.php 참조). 그러나 $ _COOKIE에는 클라이언트 (http://php.net/manual/en/reserved.variables.cookies.php)에서 HTTP 쿠키를 통해 현재 스크립트에 전달 된 변수가 들어 있습니다.

    setcookie ()를 호출 한 직후에 쿠키 값에 액세스하려면 $ _COOKIE를 사용할 수 없습니다. 그 이유는 프로토콜의 특성 때문입니다 (https://tools.ietf.org/html/rfc6265 참조). setcookie ()를 사용할 때 나머지 HTTP 헤더와 함께 클라이언트로 보낼 쿠키를 정의합니다 (http://php.net/manual/en/function.setcookie.php 참조). 그러나 $ _COOKIE에는 클라이언트 (http://php.net/manual/en/reserved.variables.cookies.php)에서 HTTP 쿠키를 통해 현재 스크립트에 전달 된 변수가 들어 있습니다.

    setcookie ()를 호출 한 후 $ _COOKIE를 변경할 때 - 여기에있는 몇 가지 답변과 마찬가지로 클라이언트의 쿠키 만 더 이상 포함하지 않습니다. 이로 인해 응용 프로그램에 사용 된 제 3 자 코드의 가정이 방해 될 수 있으며 원하지 않는 사이트 효과가 발생할 수 있습니다. 그래서 일반적으로 좋은 연습이 아니며 setcookie () 호출이 자신의 코드의 일부일 때만 옵션입니다.

    동일한 요청 내에서 setcookie ()로 값을 설정하는 깨끗하고 투명한 방법은 headers_list ()를 사용하는 것입니다 (http://php.net/manual/en/function.headers-list.php 참조).

    function getcookie($name) {
        $cookies = [];
        $headers = headers_list();
        // see http://tools.ietf.org/html/rfc6265#section-4.1.1
        foreach($headers as $header) {
            if (strpos($header, 'Set-Cookie: ') === 0) {
                $value = str_replace('&', urlencode('&'), substr($header, 12));
                parse_str(current(explode(';', $value, 1)), $pair);
                $cookies = array_merge_recursive($cookies, $pair);
            }
        }
        return $cookies[$name];
    }
    // [...]
    setcookie('uname', $uname, time() + 60 * 30);
    echo "Cookie value: " . getcookie('uname');
    

    PHP CLI (예 : PHPUnit)에서는 작동하지 않습니다. 이 경우 XDebug와 같은 타사 확장을 사용할 수 있습니다 (http://xdebug.org/docs/all_functions#xdebug_get_headers 참조).

  4. ==============================

    4.다른 페이지를로드 할 때 진짜 쿠키가 setcookie 메소드의 결과로 설정 될 때까지 즉시 쿠키 변수를 설정해야합니다.

    다른 페이지를로드 할 때 진짜 쿠키가 setcookie 메소드의 결과로 설정 될 때까지 즉시 쿠키 변수를 설정해야합니다.

    setcookie('name', $value, time()+60*30);
    $_COOKIE ['name'] = $value;
    
  5. ==============================

    5.ob_start () 및 ob_flush ()를 사용하면 클라이언트에 쿠키를 보내고 동일한 런타임에 검색 할 수 있습니다. 이 시도:

    ob_start () 및 ob_flush ()를 사용하면 클라이언트에 쿠키를 보내고 동일한 런타임에 검색 할 수 있습니다. 이 시도:

    ob_start();
    setcookie('uname', $uname, time() + 60 * 30);
    ob_flush();
    echo "Cookie value: " . $_COOKIE['uname'];
    
  6. ==============================

    6.스크립트의 setcookie () 함수는 웹 브라우저가 처음으로 페이지를 요청할 때 실행되며, 경우에 따라 다시로드됩니다. 이 쿠키는 사용자 브라우저에 저장되며 다음 요청 또는 귀하의 경우 다음 재로드까지 서버에서 실행중인 스크립트에서 사용할 수 없습니다.

    스크립트의 setcookie () 함수는 웹 브라우저가 처음으로 페이지를 요청할 때 실행되며, 경우에 따라 다시로드됩니다. 이 쿠키는 사용자 브라우저에 저장되며 다음 요청 또는 귀하의 경우 다음 재로드까지 서버에서 실행중인 스크립트에서 사용할 수 없습니다.

    다음 요청시 브라우저는 해당 쿠키를 서버에 보내고 배열 $ _COOKIE는 처음에 설정 한 값을 가지며 브라우저는 두 번째 요청시 다시 전송됩니다.

  7. ==============================

    7.나는 쿠키가 생성되는 동시에 상수를 설정했다.

    나는 쿠키가 생성되는 동시에 상수를 설정했다.

    define('CONSTANT', true);
    return setcookie('cookiename', 'cookie value goes here', time() + 60 * 60 * 24 * 30, '/');
    

    나는 즉시 다음을 수행하여 무언가를 할 수 있습니다.

    if(isset($_COOKIE['cookiename']) || $_COOKIE['cookiename'] || defined('CONSTANT') && CONSTANT)
    
  8. ==============================

    8.AJAX 호출을 사용하여이 작업을 수행 할 수 있습니다.

    AJAX 호출을 사용하여이 작업을 수행 할 수 있습니다.

    버튼을 클릭 할 때 쿠키를 생성하려면 먼저 AJAX 호출을 만들어 쿠키를 만든 다음 첫 번째 AJAX 호출 성공을 통해 쿠키를 얻기 위해 다른 AJAX를 호출 할 수 있습니다.

        function saveCookie() {
                var base_url = $('#base_url').val();
                var url = base_url + '/index/cookie';
                $.ajax({
                    'url': url,
                    'type': 'POST',
                    'success': function (data) {
                        if (data) {
                            var url = base_url + '/index/get_cookie';
                            $.ajax({
                                'url': url,
                                'type': 'POST',
                                'success': function (response) {
                                    var container = $('#show');
                                    if (response) {
                                        container.html(response);
                                    }
                                }
                            });
                        }
                    }
                });
            }
    
        <button type="button" onclick="saveCookie()">Save Cookie</button>
        <div id="show"></div>
    
  9. from https://stackoverflow.com/questions/3230133/accessing-cookie-immediately-after-setcookie by cc-by-sa and MIT license