使用PHP设置的jquery读取cookie

时间:2018-03-19 21:22:32

标签: javascript php jquery cookies

我正在尝试在PHP中设置一个cookie,然后让我的JavaScript / jQuery读取它。正如我一直在努力研究这个问题,我看到有些人谈论服务器端与客户端cookie,而其他人说cookie只是cookie而且没有区别。我所知道的是PHP看到了cookie,而JavaScript却看不到。

这是构建页面并设置cookie的PHP文件的简化版本。

<!DOCTYPE html>
<?php 
    setcookie("card", "", time()+900, '/');
?>
<html>
<body>
       <?php 
            $card = "a string I want in my cookie";
            $_COOKIE['card'] = $card;

            foreach($_COOKIE as $c => $c_value)
            {
                echo "Cookie named " . $c . " has value " . $c_value . "<br/>";
            }
        ?>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/jquery.cookie@1.4.1/jquery.cookie.min.js"></script>
    <script type = "text/javascript" src = "script.js"></script>
</body>
</html>

这将在我的页面上正确显示cookie的名称和值。所以我知道我正在设置一些东西。

但是当我的JavaScript运行时,我似乎没有任何cookie。我尝试了几种不同的方法来获取所有cookie的值,或者只是cookie的单个目标部分:

var all_cookies = document.cookie;
var aCard = $.cookie('card');

all_cookies在调试时显示值为“”,而aCard只是保持未定义状态。

所以我需要用PHP设置不同的cookie吗?或者使用JavaScript或jQuery以不同的方式阅读它们?

1 个答案:

答案 0 :(得分:1)

PHP的setcookie()函数设置一个HTTP响应头,指示浏览器设置cookie。只有在尚未发送任何输出的情况下才可以执行此操作。在之后调用setcookie() 您已输出<!DOCTYPE表示您应该收到“无法修改标题信息 - 标题已发送”警告。

要设置cookie并使其可用于Javascript,您需要在生成任何输出之前在脚本的最开头设置它:

<?php
    $card = "a string I want in my cookie";
    setcookie("card", $card, time()+900, '/');

    // note from the manual (https://php.net/setcookie):
    //     Once the cookies have been set, they can be accessed
    //     on the next page load with the $_COOKIE array.
    //     ^^^^^^^^^^^^^^^^^^^^^
    //
    // so the "card" cookie won't be in $_COOKIE until
    // the next page load. If you want it in there
    // immediately, you need to set it manually:

    $_COOKIE['card'] = $card;
?>
<!DOCTYPE html>
<html>
<body>
       <?php 
            foreach($_COOKIE as $c => $c_value)
            {
                echo "Cookie named " . $c . " has value " . $c_value . "<br/>";
            }
        ?>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/jquery.cookie@1.4.1/jquery.cookie.min.js"></script>
    <script type = "text/javascript" src = "script.js"></script>
</body>
</html>

既然您在生成任何输出之前已经使用过setcookie(),那么Cookie设置正确,Javascript应该可以从document.cookie轻松访问它。