【问题标题】:php isset cookie issuesphp isset cookie 问题
【发布时间】:2013-02-27 17:15:12
【问题描述】:

简短:由于某种原因,某些浏览器/计算机未检索到 cookie '_sid'。 Long:我正在使用 3 个文件。 /index.php、/scripts/login.php 和 /iframes/register.php。 现在,当输入登录信息时,会发生一堆标准的事情,并且用户已登录。设置了一个名为 '_sid' 的 cookie,并将值存储在 mySQL 表中。

登录.php:

setcookie("_sid", $sid, 0, '/'); ?>

现在所有计算机都获得了这个 cookie - 我已经测试了超过 15 台,都通过了。只是想告诉你我是如何设置 cookie 的。

问题出在index.php:

<?php
$username="x"; $password="y"; $database="z";
mysql_connect(localhost,$username,$password);

@mysql_select_db($database) or die( "Unable to select database");
$loggedin=false; $team="none";
if(isset($_COOKIE['_sid'])){  //error happens here
    print_r("test");
    $session_id=$_COOKIE['_sid'];

现在错误发生在注释行上。 isset 返回 false。现在通常这将是某种有用的指标。不过……

第三个文件 register.php 赋予用户注册其他人的能力(无关)。需要注意的重要一点是文件 的开头与 index.php 完全相同。

<?php
$username="x"; $password="y"; $database="z";
mysql_connect(localhost,$username,$password);

@mysql_select_db($database) or die( "Unable to select database");
$loggedin=false; $team="none";
if(isset($_COOKIE['_sid'])){
    print_r("test");
    $session_id=$_COOKIE['_sid'];

但是,此文件有效。没错,isset 有效。此文件也适用于所有 15/15 计算机。

现在让这一切变得更加混乱,index.php 在 15 台计算机中的大约 10 台上运行。该错误总是发生在 mac(chrome、ff、safari)和 Linux(ff 测试,但也可以假设 chrome)。它适用于大多数窗口(7+8 使用 chrome,ff)。但是,当使用相同的双胞胎计算机(在虚拟操作系统上)时,一台计算机工作,而另一台计算机失败(使用 ff)。

我已经解决这个问题两天了,真的不知道该怎么办......

【问题讨论】:

  • cookie 是只在 login.php 上设置的,还是有另一个文件可以设置 cookie.. 询问原因:cookie 可能是特定于目录的
  • 只是出于好奇,不使用 PHP 内置会话处理的原因是什么?
  • 当你使用 empty 代替 isset 时,你会遇到同样的问题吗?略有不同,但您可以尝试一下...
  • cookie 仅在 login.php 中设置。我会尝试添加第 5 个参数...我不确定为什么它不存在。我没有使用内置会话,因为最终我将允许用户在浏览器关闭后保持登录状态。
  • 也可以在 PHP 内置会话处理中进行持久会话,请参阅 stackoverflow.com/questions/9797913/…

标签: php cookies setcookie


【解决方案1】:

当您设置 cookie 时,浏览器会将其添加到同一域的新请求的标头中。

您必须验证 login.php 在 index.php 之前被浏览器调用,而不是在同一个请求中。

  1. login.php - 浏览器不发送cookie,但接收设置它的请求
  2. index.php - 浏览器发送 cookie

如果你的 index.php 中有

<include "login.php">

这绝对行不通。

【讨论】:

  • 我的 index.php 中没有 。我对你在说什么有点困惑;我在设置 cookie 之前、期间和之后使用 index.php。在 index.php 中,有一个 iframe (/iframes/login.php)。 login.php 发布到 /scripts/login.php,这是设置 cookie 的位置。
  • 你为什么要为此使用 iframe?没有理由,它使事情变得不可靠。发布到主框架上的 login.php,然后使用 header('Location: your.site.com/index.php') 强制重定向
  • 那...实际上是一个好点...但是不可靠的部分是什么?为什么以及如何?
  • iframe 和 cookie 是一团糟。谷歌为它。您还应该为 cookie 设置一个有效的过期时间(不是 0)。浏览器或第三方安全可能会阻止它。
  • 0 是有效的过期时间,这意味着当浏览器关闭时 - 罪魁祸首很可能是 iframe。
猜你喜欢
  • 2017-12-16
  • 1970-01-01
  • 2020-10-25
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
相关资源
最近更新 更多