Accessing $_COOKIE immediately after setcookie()

PhpCookies

Php Problem Overview


I'm trying to access a cookie's value (using $_COOKIE) immediately after calling the setcookie() function in PHP. When I do so, $_COOKIE['uname'] isn't set. Why?

Note, however, that $_COOKIE['uname'] is set as expected upon the next execution of the script, such as after a page refresh.

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

Php Solutions


Solution 1 - Php

The cookie isn't set until the response is sent back to the client, and isn't available in your PHP until the next request from the client after that.

However, when you set the cookie in your script, you can do:

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

Solution 2 - Php

$_COOKIE is set when the page loads, due to the stateless nature of the web. If you want immediate access, you can set $_COOKIE['uname'] yourself or use an intermediate variable.

For example:

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

Solution 3 - Php

If you want to access a cookie's value immediately after calling the setcookie() you can't use $_COOKIE. The reason for this is in the nature of the protocol (see https://www.rfc-editor.org/rfc/rfc6265). When you use setcookie() it defines a Cookie to be sent along with the rest of the HTTP headers to the client (see http://php.net/manual/en/function.setcookie.php). But $_COOKIE on the other hand contains variables passed to the current script via HTTP Cookies from the client (http://php.net/manual/en/reserved.variables.cookies.php).

When you change $_COOKIE after calling setcookie() - like some answers here recommend - it doesn't contain only the Cookies from the client any more. This could interferer with assumptions made in third party code used in your application and may result in unwanted site effects. So in general it's not good practice and it's only an option when the calls of setcookie() are part of your own code.

A clean and transparent way to get a value set with setcookie() within the same request is to use headers_list() (see 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');

But notice this won't work in PHP CLI (e.g. PHPUnit). In such a case you could use third party extensions like XDebug (see http://xdebug.org/docs/all_functions#xdebug_get_headers).

Solution 4 - Php

You have to set the cookie variable by yourself if you need it immediately, by the time you load another page the real cookie would have been set as a result of the setcookie method.

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

Solution 5 - Php

We can do this using AJAX calling.

If we want to create cookies on button click so first create a AJAX call for creating cookies then the success of first AJAX calling we can call another AJAX for getting the cookies.

    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>

Solution 6 - Php

I had a similar problem where i used a function from a included file and solved it with a function that both returns the value of the cookie and sets the cookie.

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;

Solution 7 - Php

Using ob_start() and ob_flush() you can send the cookie to client and retrieve it in the same run time. Try this:

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

Solution 8 - Php

Your script's setcookie() function runs when the web browser requests the page for the first time, in your case the reload. This cookie is stored in the users browser and isn't available to your script running on the server until the next request, or in your case the next reload.

Upon the next request the browser sends that cookie to the server and the array $_COOKIE will have the value that you initially set and the browser sent back upon the second request.

Solution 9 - Php

I set a constant at the same time the cookie was created

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

I can then immediately do something by:

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionheapzeroView Question on Stackoverflow
Solution 1 - PhpMark BakerView Answer on Stackoverflow
Solution 2 - PhpJason McCrearyView Answer on Stackoverflow
Solution 3 - PhpwitrinView Answer on Stackoverflow
Solution 4 - PhpJoshuaView Answer on Stackoverflow
Solution 5 - PhpFakirchand PatidarView Answer on Stackoverflow
Solution 6 - PhpSebastiaan KoopmanView Answer on Stackoverflow
Solution 7 - PhpWill SoaresView Answer on Stackoverflow
Solution 8 - PhpRobert RochaView Answer on Stackoverflow
Solution 9 - PhpvirtualLastView Answer on Stackoverflow