setcookie () 직후 $ _COOKIE 액세스


80

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

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

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

불행히도 여기에 대한 답변은 해결책을 제공하지 않거나 수락 된 경우에도 나쁜 해결 방법을 제안하지 않습니다 . stackoverflow.com/questions/3230133#34465594를 참조하십시오 .
witrin

@witrin 제공된 링크가 동일한 q / a로 리디렉션되는 것 같습니다.
trainoasis

이건 불가능 해. $_COOKIE자신 에게 해당 항목을 설정 하거나 즉시 리디렉션 (동일한 페이지로)을 수행 하여 "가짜"해야 합니다.
caw

답변:


37

$_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);  
}

21
이 ... 페이지 새로 고침 전에 쿠키에 액세스 할 수 있도록 그 :)에 대한 마크 베이커의 대답은 더 아래를 참조하지 않습니다
패스 파인더

그건 사실이 아니야. 나는 OP의 코드를 기반으로 $uname스크립트에서 사용한다고 가정 했습니다. Mark Baker는 $_COOKIE['uname']직접 사용 합니다.
Jason McCreary 2013 년

1
조금 잘못해서 죄송합니다. 내 목적을 위해 비동기 스크립트를 위해 $ _COOKIE를 설정하면 실제로 쿠키가 설정되지 않고 브라우저로 다시 전송되었습니다 (쿠키도 필요했습니다). 내 스크립트에서만 사용할 수있게되었습니다. Mark Baker의 대답이하는 setcookie ()도 사용해야합니다. 또한 그의 코드는 Google 검색에서 여기로 오는 사람들에게 훨씬 짧고 유용합니다.
탐험

나는 setcookie(). 이 답변은 귀하의 정확한 요구 사항을 충족하지 못할 수 있습니다. 그러나 그것이 틀린 것은 아닙니다 . OP와 SO는이 답변이 유용하다는 것을 알았습니다.
Jason McCreary 2013 년

2
이 답변이 "답변"으로 표시되는 이유를 이해할 수 없습니다. 쿠키를 직접 사용하는 방법을 설명하지 않으며 제공된 코드는 게시 된 동일한 OP와 같습니다. setcookie()해당 코드 이후 에는 액세스 할 수 없습니다$_COOKIE['uname']
Isthar

153

쿠키는 응답이 클라이언트로 다시 전송 될 때까지 설정되지 않으며 이후 클라이언트에서 다음 요청이있을 때까지 PHP에서 사용할 수 없습니다.

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

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

2
아주 간단한 해결책. 감사!
dawoodman71

1
훌륭한 물건. 두 번째 줄이 통과되지 않은 만료 시간을 어떻게 설정하는지 궁금합니다.
martinedwards 2015 년

2
@martinedwards 두 번째 줄은 만료 시간을 설정하지 않습니다 .... 요청 기간 동안 설정됩니다. 브라우저에서 요청과 함께 전달 된 쿠키 값이 요청 기간 동안 존재하는지 정확히 같은 방법으로
마크 베이커

@MarkBaker 간단한 솔루션 !! 고마워요

당신은 말하려고합니다. 쿠키 값에 접근하려면 페이지 (php 파일)에 두 번 접근해야합니다. 첫 번째는 쿠키를 설정하고 두 번째는 설정된 쿠키에 액세스합니다. 옳은?
Pratik

31

를 호출 한 직후 쿠키 값에 액세스하려면 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 쿠키 통해 현재 스크립트로 전달 된 변수가 포함되어 있습니다 .

$_COOKIE전화 후 변경하면 setcookie()-여기에 일부 답변이 권장되는 것처럼-더 이상 클라이언트의 쿠키 만 포함되지 않습니다. 이로 인해 애플리케이션에 사용 된 제 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 참조 ).


6
여기에는 단 하나의 실제 솔루션이 있습니다. setcookie를 포함 할 수있는 타사 코드를 수정하지 않고 정리합니다.
Michael

1
op가 다른 솔루션에 투표 한 이유를 잘 모르겠지만 이것이 실제로 저를 도왔던 올바른 솔루션입니다.
ChrisP777

이 100 %는 프로덕션 환경에서 실행 가능한 유일한 대답입니다. 훌륭한 솔루션 @witrin
skidadon

이유는 모르겠지만 on $ limit 매개 변수가 explode()작동 하지 않습니다 . 전체 문자열이 포함 된 배열 요소 하나만 반환합니다. ideone.com/7SnV9y
NaturalBornCamper

5

즉시 필요한 경우 쿠키 변수를 직접 설정해야합니다. 다른 페이지를로드 할 때 실제 쿠키는 setcookie 메서드의 결과로 설정되었을 것입니다.

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

1

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>

의도가 좋은 경우에도 OP에는 PHP 만 필요한 답변이 필요합니다. :) 아마도 그것이 당신이 반대표를 가지고있는 이유 일 것입니다. 나는 당신을 반대표로하지 않았습니다.
Máxima Alekz

이것은 또한 고려해야 할 하나의 접근법이기 때문에 찬성되었습니다!
Dhruv Thakkar

1

포함 된 파일의 함수를 사용하고 쿠키의 값을 반환하고 쿠키를 설정하는 함수로 해결하는 비슷한 문제가 발생했습니다.

function setCookie($input) {
  setcookie('uname', $input, time() + 60 * 30);
  return $input;
}

if(!isset($_COOKIE['uname'])) {
    $uname  = setCookie($whatever);
} else {
    $uname = $_COOKIE['uname'];
}

echo "Cookie value: " . $uname;

-1

사용하기 위한 ob_start ()ob_flush 것은 () 는 클라이언트에 쿠키를 전송할 수 있으며, 동일한 런타임에 검색 할 수 있습니다. 이 시도:

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

이것은 작동하지 않는 것 같습니다 (PHP 5.4 w / nginx). 확장 해 주시겠습니까?
Paul DelRe 2014 년

-1

setcookie()웹 브라우저가 처음으로 페이지를 요청할 때 스크립트의 기능이 실행됩니다. 이 쿠키는 사용자 브라우저에 저장되며 다음 요청이있을 때까지 또는 다음 번에 다시로드 할 때까지 서버에서 실행되는 스크립트에서 사용할 수 없습니다.

다음 요청시 브라우저는 해당 쿠키를 서버로 전송하고 어레이 $_COOKIE는 사용자가 처음 설정 한 값을 가지며 브라우저는 두 번째 요청시 다시 전송됩니다.


-3

쿠키 생성과 동시에 상수를 설정했습니다.

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

그런 다음 즉시 다음을 수행 할 수 있습니다.

if(isset($_COOKIE['cookiename']) || $_COOKIE['cookiename'] || defined('CONSTANT') && CONSTANT)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.