php setcookie not working with ajax call
Solution 1
If you don't add a $path
value to setcookie()
, it defaults to "the current directory". This means that if you set the cookie from /web/DEV/Classes/SetCookie.php
, the cookie gets set to /web/DEV/Classes/
, and anything above that path won't see that cookie.
To fix this, add a specific $path to setcookie. If your app runs on the domain root (example.com), use '/'
. If it's in a subfolder (example.com/myapp/), use '/myapp/'
setcookie("TestCookie", $var, time()+60*60*24*30, '/');
Solution 2
I think you should look into the path parameter of the setcookie. Set it to "/" , so that it is accessible from across all directories/pages of the site.
adam
I am a Software Engineer with 11 years of professional experience. I work with ASP.NET, C# & VB.NET, JS/JQuery and SQL on a daily basis. I am on stackoverflow to grow and learn as a professional developer give back to the community in my free time
Updated on October 19, 2020Comments
-
adam over 3 years
I have a page, test.php, with the following code:
<html> <body> <form> <script type="text/javascript"> function SendCookies(){ if (window.XMLHttpRequest)/* code for IE7+, Firefox, Chrome, Opera, Safari */ { xmlhttp=new XMLHttpRequest(); } else /* code for IE6, IE5 */ { xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status == 200) { alert('done'); } } xmlhttp.open("GET", "/web/DEV/Classes/SetCookie.php?time=" + new Date()); xmlhttp.send(); } </script> <input type="text" id="txtInput" name="txtInput"/> <input type="button" id="btnSubmit" name="btnSubmit" value="Submit" onclick="SendCookies()"/> <div id="divTest"> <?php if (isset($_COOKIE["TestCookie"])) { echo $_COOKIE["TestCookie"]; } else { echo "__Results__"; } ?> </div> </form> </body> </html>
I have a page, SetCookie.php, with the following code:
<?php $var = "THIS IS A TEST"; setcookie("TestCookie", $var, time()+60*60*24*30); ?>
When test.php's button is clicked, i use XMLHttpRequest to call my SetCookie.php page. The page executes, becuase if i add an echo to it, i get that in the xmlhttp response. However, TestCookie does not seem to be getting set.
If in text.php, i do the same command found in SetCookie.php, the cookie is then set accordingly for all browser sessions.
Even after i close / open the browser, the cookie remains unchanged from when i once set it in my test.php page manually.
----EDIT-----
I added:
if(!setcookie("TestCookie", "A", time()+60*60*24*30, "/")) { echo "FAIL"; }
to the very top of test.php, however when i reload the page, it never shows the updated cookie... because that cookie was already set without the ,"/" parameter, and cannot be modified later, with the ,"/" parameter.
After clearing the cache and working with the suggested code, i cleared my cookies from the browser and used the added parameter for the set method, i was able to manipulate the cookies from all pages!!! thank you so much!!
-
adam over 10 yearsNote, this will not change an already existing cookie. The old cookie must be cleared out first, if it did not have a path specified.