【问题标题】:php cookie does not work at the first time readingphp cookie 在第一次读取时不起作用
【发布时间】:2015-10-20 15:13:49
【问题描述】:

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

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

一个代码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() 添加到上面的文件,但两者都不起作用。

Cookie2.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")
?>

printcookie.php:

<?php
print_r($_COOKIE);
?>

非常感谢您提前回答!

米歇尔

【问题讨论】:

  • PHP 的超全局变量在脚本启动时设置,然后再也不会被 PHP 触及。您在脚本中所做的任何会更改超全局的操作都只会在脚本下一次运行时可见。
  • @Marc B:“你在脚本中所做的任何会改变超全局的事情都只会在脚本下一次运行时可见”——太模糊了

标签: php cookies


【解决方案1】:

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

另一方面 - $_COOKIE 填充了 从客户端发送的 cookie

所以在第一步 - 您使用setcookie 设置 cookie 并且在 $_COOKIE 中没有任何内容,因为客户端尚未发送它,并且只会在下一个请求时发送。

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

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

【讨论】:

  • 非常感谢您的帮助
【解决方案2】:

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

  1. Cookie 对于存储一些信息(例如用户的主题偏好或首选起始页等)来说并不坏。它们因用于身份和身份验证处理而获得了不好的代表。那里有基本上具有“isAdmin = 0”的cookie,以控制用户访问。 非常很容易将其更改为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!";
    

如果他们清除 cookie 等,这也会有所帮助。

但实际上,更安全的路线是:

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

$name =  $_SESSION['name'];
$pwd = $_SESSION['pwd'];

即使这样也会因为严重的网络安全问题而受到反对,在这种情况下,您应该简单地根据存储的哈希检查密码,然后将其删除,使用其他全局变量来确认会话完整性。但现在有一个完整的 StackExchange。

【讨论】:

  • 非常感谢!,我会尝试会话。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2012-08-19
    • 2011-10-11
    • 2016-08-10
    • 2011-06-01
    • 1970-01-01
    • 2012-07-09
    • 2016-10-17
    • 1970-01-01
    相关资源
    最近更新 更多