Home > Back-end >  PHP can't get cookie that was set in javascript
PHP can't get cookie that was set in javascript

Time:02-06

I am using PHP 8.0 and this is a wordpress site version 6.1.1

I have a plugin that is setting a cookie like so:

window.tourmaster_set_cookie = function( cname, cvalue, expires ){
        if( typeof(expires) != 'undefined' ){
            if( expires == 0 ){
                expires = 86400;
            }

            var now = new Date();
            var new_time  = now.getTime()   (parseInt(expires) * 1000);
            now.setTime(new_time);

            expires = now.toGMTString();
        }

        document.cookie = cname   "="   encodeURIComponent(cvalue)   "; expires="   expires   "; path=/";
    }

This is being called like so:

tourmaster_set_cookie('tourmaster-room-cart', JSON.stringify(cart_cookie), 31536000);

I can see in my console log that this cookie is being set.

However when I try to get the cookie in PHP:

$_COOKIE['tourmaster-room-cart']

I get this error:

Warning: Undefined array key "tourmaster-room-cart"

When I do a print_r on $_COOKIE the cookie "tourmaster-room-cart" is not there.

What is going wrong here and how can I fix it?

UPDATE

I created this simple cookie:

document.cookie = "username=John Doe; expires=Thu, 18 Dec 2025 12:00:00 UTC; path=/";

and it appears in my php $_COOKIE;

However this does not show up in $_COOKIE

window.tourmaster_set_cookie = function( cname, cvalue, expires ){
        expires = "Thu, 1 Jan 2026 12:00:00 UTC";
        if( typeof(expires) != 'undefined' ){
            if( expires == 0 ){
                expires = 86400;
            }

            var now = new Date();
            var new_time  = now.getTime()   (parseInt(expires) * 1000);
            now.setTime(new_time);

            expires = now.toGMTString();
        }

        document.cookie = cname   "=test; expires=Thu, 1 Jan 2026 12:00:00 UTC; path=/";

    }

ANOTHER UPDATE

I added a few more cookies to see if they would get displayed with $_COOKIES, they all did except for the last test with encodeURIComponent(cvalue) as the value. It must be something in my value? Here is the updated code and below that is the value.

window.tourmaster_set_cookie = function( cname, cvalue, expires ){
        if( typeof(expires) != 'undefined' ){
            if( expires == 0 ){
                expires = 86400;
            }

            var now = new Date();
            var new_time  = now.getTime()   (parseInt(expires) * 1000);
            now.setTime(new_time);

            expires = now.toGMTString();
        }
        document.cookie = "newusernameagain=John Doe; expires=Thu, 18 Dec 2025 12:00:00 UTC; path=/";
        document.cookie = "newusername-again=John Doe; expires=Thu, 18 Dec 2025 12:00:00 UTC; path=/";
        document.cookie = "new-username-again="   encodeURIComponent(cvalue)   "; expires=Thu, 18 Dec 2025 12:00:00 UTC; path=/";
        document.cookie = cname   "="   encodeURIComponent(cvalue)   "; expires="   expires   "; path=/";

    }

And the value

[{"start_date":"2023-02-05","end_date":"2023-02-06","room_amount":"1","adult":["2"],"children":["0"],"room_id":"15701","post_type":"room"}]

I have no idea what is going wrong.

FINAL UPDATE

For some stupid reason when I remove the dashes from the cookie name and where it is referenced everything works. For some odd reason $_COOKIE does not like dashes for the cookie name on this godaddy server, very odd stuff.

CodePudding user response:

If you have passed a correct value (e.g. "SO test") in cart_cookie, then the script should work.

A normal way to set cookie in JS is like:

document.cookie = "username=John Doe; expires=Thu, 1 Jan 2016 12:00:00 UTC";

So assuming the JS script is:

<script>
window.tourmaster_set_cookie = function( cname, cvalue, expires ){
        document.cookie = cname   "="   encodeURIComponent(cvalue)   "; expires="   expires   "; path=/";
    }

tourmaster_set_cookie('tourmaster-room-cart', JSON.stringify('SO test'), "Thu, 1 Jan 2026 12:00:00 UTC");

alert("Done ! Now redirecting to show the cookie string");

window.location.href="testSO5Feb2023c.php"; 

</script>

On running it , it will set the cookie, and then redirect to another page (I named it testSO5Feb2023c.php), which shows that the cookie is correctly set

For testSO5Feb2023c.php :

<?php

echo "Cookie is now : <br>";
echo $_COOKIE['tourmaster-room-cart']; 

?>

You may see the DEMO

Last but not least, please note that the cookie is retrievable ONLY after it is set, so make sure the page to display the cookie is different from the one you set the cookie, otherwise you may need a page refresh

CodePudding user response:

For some stupid reason when I remove the dashes from the cookie name and where it is referenced everything works. For some odd reason $_COOKIE does not like dashes for the cookie name on this godaddy server, very odd stuff.

  • Related