PHP cookie 在第一次读取时不起作用


php cookie does not work at the first time reading

我是PHP的初学者,正在学习使用cookie登录。 请任何人检查我的代码以查看我的问题是什么,或者让我如何解决此问题。

当我第一次打开页面时,cookie 将不起作用。 当我重复打开该链接时,它将起作用。但是,使用函数包含和标头后,我仍然无法使其工作 代码之一是:

一个代码cookie.php是:

<?php
setcookie("cookiename",$_REQUEST['name']);
if(isset($_COOKIE['cookiename'])){
$cookieSet = ' The Cookie is ' .  $_COOKIE['cookiename'];
} else {
$cookieset = ' No Cookie has been set';
}
setcookie("cookiepwd",$_REQUEST['pwd']);
print_r($_COOKIE);
?>

当我第一次运行此代码时,它不会显示任何内容。我可以第二次看到 cookie 数据。据说在某些网站上,cookie不会在同一页面上读取。

所以我将print_r($_COOKIE(移动到第二个php文件,并在上面的文件中添加了函数include((或header((,但两者都不起作用。

饼干2.php:

<?php
setcookie("cookiename",$_REQUEST['name']);
if(isset($_COOKIE['cookiename'])){
$cookieSet = ' The Cookie is ' .  $_COOKIE['cookiename'];
} else {
$cookieset = ' No Cookie has been set';
}
setcookie("cookiepwd",$_REQUEST['pwd']);
include(‘printcookie.php’);
//or header("Location: printcookie.php")
?>

打印饼干.php:

<?php
print_r($_COOKIE);
?>

非常感谢您提前回答!

米歇尔

setcookie只设置发送到客户端的标头。它不会改变超全局$_COOKIE

另一方面 - $_COOKIE客户端发送的 cookie 填满

所以在第一步 - 你用setcookie设置cookie,$_COOKIE什么都没有,因为客户端还没有发送它,只会在下一个请求中发送。

而且没有办法做你想做的事,而不是手动修改$_COOKIE

PS:将用户的密码放在cookie中是个坏主意

给 zerkms 答案,但我只想重申:

  1. Cookie 对于存储用户的主题偏好或首选起始页等信息还不错。 他们从用于身份和身份验证处理中获得不良代表。有一些cookie基本上有"isAdmin=0"来控制用户访问。很容易将其更改为isAdmin=1并有一个野外活动日。 由于您是 PHP 的新手,请花点时间了解会话,而现在它对您来说都是新的。

  2. 当您使用 setcookie 设置 cookie 时,您将向浏览器发送包含 cookie 信息的 HTTP 标头。 然后,浏览器将在将来向服务器发出任何请求时将该 cookie 传回。 $_COOKIE全局变量保存从浏览器传递到服务器的 cookie 信息。

  3. 由于您使用$_REQUEST来获取cookie名称,因此无需检查cookie(否则您将没有数据来正确设置它?所以考虑走这条路:

    if(!isset($_COOKIE['cookiename'])) {
          $name = $_POST['name']);
          setcookie("cookiename",$name);
     } else {
        $name = $_COOKIE['cookiename']);
     }
    echo "Welcome back $name!";
    

如果他们清除饼干等,这也将有所帮助。

但实际上,更安全的途径是:

session_start();
if(!isset($_SESSION['name'])){
    $_SESSION['name'] = $_POST['name']);
}
if(!isset($_SESSION['pwd'])){
    $_SESSION['pwd'] = $_POST['pwd']);
}
$name =  $_SESSION['name'];
$pwd = $_SESSION['pwd'];

即使这对于严肃的 Web 安全来说也是不受欢迎的,您应该简单地根据存储的哈希检查密码,然后将其删除,使用其他全局变量来确认会话完整性。但是现在有一个完整的StackExchange。

作为一种解决方法,您可以在检查 cookie 后使用 location(( 来访问存储的数据。

但请注意,如果任何内容(包括脚本中的中断和空白(已经发送到浏览器,则 location(( 会失败。