【问题标题】:PHP session doesn't work correctly maybe because of fb? please helpPHP会话无法正常工作可能是因为fb?请帮忙
【发布时间】:2011-06-13 03:37:32
【问题描述】:

我有一个关于 PHP 会话的问题。我使用会话来保持访问者的登录状态。我之前已经用它制作了一个网站并且效果很好。现在我正在制作一个 Facebook 应用程序。

登录时(检查用户是否在数据库中注册),我注册id。之后我使用:

if(session_is_registered("id"))
{
echo "Logged in";
}

因此,如果它在浏览器中显示“已登录”,我绝对确定会话已注册。但是当我转到下一页(页面顶部有 session_start(); )时,不再有会话。但是,如果我转到注销页面(使用 session_destroy();),然后继续登录,则会话已正确注册。另外,如果我关闭所有浏览器窗口然后登录,它也不会正确注册。

我尝试在注册“id”之前销毁会话,但这也不起作用。

我猜我犯了一个基本错误,所以这里的人应该能够帮助我而不会浪费很多时间。

请帮助我。我在这上面浪费了好几天。 提前致谢。


更多代码:

会话在哪里注册:

$id_query = mysql_query ("
    SELECT * FROM Tour11_deelnemers WHERE fb_id = '$user'");
    while ($record = mysql_fetch_assoc ($id_query))
        {
        $id = $record['deelnemer_id'];
        }
if($id > 0)
{
$speelid = $id;
session_register("speelid");
}

之后检查是否注册:

if(session_is_registered("speelid"))
{
echo "Ingelogd";
}

session_is_registered() 与 $_SESSION 的 isset() 相同。

所以我不明白的是,虽然 session_is_registered() 在注册后是真的,但在下一页它又是假的:(除非我在退出页面后立即登录 (session_destroy();)。因此,即使我在重新启动会话并再次注册之前销毁会话,也无济于事。

【问题讨论】:

  • 请贴一些真实的代码,因为session_is_registered("id")不够清楚。也许你需要做session_is_registered($_SESSION["id"])?告诉我们session_is_registered() 函数的参数是什么,它的作用是什么?
  • @Shef session_is_registered 是内置的 PHP 函数,所以不需要解释它是如何工作的 :)
  • session_registersession_unregistersession_is_registered 不应再使用。
  • 你说得对,我不知道这个功能,因为我尽量远离“全局变量”的土地。这个函数好像是deprecated on 5.3。所以,是时候让我们都习惯远离“全局变量”领域了。
  • 我还用 $_SESSION['id'] 和 isset 尝试了整个代码......但后来我遇到了同样的问题,所以我用 session_register() 尝试了这个旧版本.所以使用较新的会话内容并没有帮助。

标签: php facebook session login


【解决方案1】:

这里有一个解决方案。

像这样设置会话:

if(!isset($_SESSION['speelid'])){
   $id_query = mysql_query ("SELECT * FROM Tour11_deelnemers WHERE fb_id = '$user'");
        while ($record = mysql_fetch_assoc ($id_query)){
            $id = $record['deelnemer_id'];
        }
    if($id > 0){
        $_SESSION['speelid'] = $id;
    }
}

检查会话是否设置如下:

if(isset($_SESSION['speelid'])){
    echo "Ingelogd";
}

更新

问题似乎与 >= IE6 拒绝接受由 php 生成的会话 cookie 有关,当 .php 文件从不同服务器上的 .html 文件引用时。

.HTML 到 .PHP 会话 IE 问题

使用会话时 .php 文件中的变量由 a 引用 框架(.html 或其他文件类型)在 与一份服务不同的服务器 .php:

在这些条件下 IE6 或更高版本 默默地拒绝会话 cookie 试图创建( 通过调用隐式或显式 session_start())。

因此,您的会话 变量将返回一个空值。

根据 MS kb,解决方法是 添加一个标题,说明您的遥控器 .php 页面不会滥用事实 该权限已被授予。

将此标头放在 .php 文件中 这将创建/更新会话 你想要的变量:

Here is a full thread on this issue

解决方案

解决方案是将其添加到将设置会话的页面的最顶部。

<?php header('P3P: CP="CAO PSA OUR"'); ?>

【讨论】:

  • 试过了,但也显示登录,但在下一页上没有 $_SESSION['id'] 了。除非我在访问注销页面后进入登录页面。
  • 好的,让我了解一下这里发生了什么: 1. 首先你进入登录页面,你登录,上面写着“登录”,对吧? 2. 当您导航到另一个页面时,它没有显示“已登录”? 3. 但是当你退出并返回登录时,它显示“已登录”?
  • 差不多了。 3 应该是:但是当您退出并返回登录并登录时,它会显示“已登录”,如果您转到任何其他页面,您仍处于登录状态。因此解决方案可能是将用户重定向到在登录之前退出页面,但这当然不是真正的解决方案......
  • hmm... 对我来说闻起来像 www non-www 问题。如果您有权访问.htaccess,请尝试使用或不使用www 强制访问该站点。也就是说,如果用户尝试登录http://site.com/login.php,并且在您检查凭据并将其转发到http://www.site.com/logged.phpheader() 之后。尝试.htaccess 技巧,或尝试将会话域从.domain.com 设置为domain.com
  • 我正在用www 到处测试它...所以这不是问题:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 2020-08-09
  • 2018-12-24
  • 1970-01-01
相关资源
最近更新 更多