【问题标题】:Session variable not staying set会话变量未设置
【发布时间】:2013-08-13 00:06:19
【问题描述】:

警告:不是重复的,我找不到这个问题。

我正在本地主机上测试和构建我的网站。我的登录页面上有以下代码,如果用户有用户 ID cookie,则将用户发送到他们的个人资料页面,并且他们的 IP 与他们的 cookie 所说的相同。

if($_COOKIE["IPcookie"] == $_SERVER['REMOTE_ADDR']) {
    $cookieresult = mysqli_query($connection, 'SELECT COUNT(`ID`) AS count FROM users WHERE username="$_COOKIE["usercookie"]" AND `active`="1"');
    if($cookieresult == 0) {
        $loginquery = mysqli_query($connection, "SELECT * FROM users WHERE username=" .$_COOKIE['usercookie']);
        $row5 = mysqli_fetch_assoc($loginquery);
        $dbIDlogin = $row5['ID']; 
        $_SESSION['userID'] = $dbIDlogin;
        header('Location: /userprofile.php');
    }

但是,当我使用这些 cookie 访问用户个人资料时,$_SESSION['userID'] 有时是 NULL。我似乎无法弄清楚为什么“有时”$_SESSION 会变成NULL。我似乎无法在其中找到任何模式。我登录一个用户,点击他们个人资料页面上的所有链接,这些链接转到网站的不同区域,然后返回loginuser.php(上面显示的文件),它适用于一个用户,但不适用于另一个用户.它似乎是完全随机的,这让我感到困惑。我想不出它会在用户之间改变的任何原因。我将继续对此进行测试,看看是否能找到一种模式,但已经投入了几个小时,它看起来完全是随机的。

以下任何一个似乎都没有回答我的问题:

PHP SESSION data lost between page loads with WAMPserver 2.0 on localhost -我检查了我的 php.ini,它有这些代码行(虽然是不同的,但可以正常工作的 tmp 文件)。所选答案中测试 $_SESSION 变量的示例代码就像一个魅力。我的代码,没有。

PHP Session not Saving 我的session_save_path() 是可写的。

PHP session not being saved between pages PHP Session data not being saved 我在本地主机上,而不是服务器上。

session_start(); 在每个页面上,不包括仅在开头有session_start(); 的页面中引用的模板(因为如果session_start(); 在模板中,那么它会出现关于会话如何已经存在的错误开始)。

更新:我可能有一个模式。用户名包括字母的用户不会保存他们的信息。所有这些用户的用户名也更长,因为他们的用户名是“dummy”和“eport”之类的词,而不是“1”和“9”。它适用于 1 和 9,但不适用于 dummy 和 eport。现在,这没有任何意义,因为它们都是由它们的 ID 标识的,它们总是数字,但这似乎是一种模式。

更新(userprofile.php中的相关代码):

<?php

$userID = $_SESSION['userID'];
var_dump($_SESSION['userID']);


//get.
$totalquery = mysqli_query($connection, "SELECT * FROM users WHERE ID='$userID'");
$arrayquery = mysqli_fetch_assoc($totalquery);
$username = $arrayquery['username'];

//Firstname
$firstname = $arrayquery['firstname'];
echo 'Welcome ' .  $firstname;
//Lastname

?>

【问题讨论】:

  • 您是否在任何地方添加了session_start();?如果没有,它将失败。咨询=>php.net/manual/en/ref.session.php“我在你的代码中没有看到,也没有提到。”
  • @Fred 我在每个 php 文件的开头都有session_start();。如果那不存在,它有时甚至都行不通。很抱歉没有在我的问题中包含它,这是大多数问题的答案。我现在已经更新了。
  • 好的,感谢您澄清这一点。你的听起来像是一个非常特殊的问题。我怀疑我能提供进一步的帮助。
  • 整数用户名正在工作并且变量由它们的 ID 调用的事实让我相信那里有些东西混淆了......也许你有一行代码调用用户名而不是ID,但有时它会起作用,因为名称是一个 ID。但鉴于我们的信息有限,这个问题将很难解决。
  • 我将从用户个人资料中添加应该相关的代码。

标签: php session


【解决方案1】:

这段代码基本上什么都不做:

$cookieresult = mysqli_query($connection, 'SELECT COUNT(`ID`) AS count FROM users WHERE username="$_COOKIE["usercookie"]" AND `active`="1"');

当查询实际失败时,$cookieresult 只是大致等于0(实际上是false)。我猜你真正需要做的是从设置为$cookieresult 的结果资源句柄中实际读取数据以确定count(ID) 的值。

【讨论】:

  • 我理解你所说的意思,但我仍然很困惑。那个代码什么也没做,我不知道我想用它做什么......而且我越看它就越没有意义。我将其更改为:$cookieresult = mysqli_query($connection, 'SELECT * FROM users WHERE username="$_COOKIE["usercookie"]" AND active="1"'); 它仍然有效,标题仍然激活。但是,既然存在,它不应该是正数还是1?为什么它在不应该激活的时候激活?你能解释更多,或者解释一下如何“从结果中读取数据”?
  • 听起来你的工作正常。我的主要问题是您没有调用mysqli_fetch_assoc() 或类似方法来实际从mysqli_query() 返回的结果集指针中读取数据。我应该注意的另一件事是您的代码容易受到 SQL 注入的影响。您需要在查询中使用 cookie 变量之前对其进行转义,或者更好的是您可以调查参数化预准备语句的使用,如果您计划广泛使用 DB,这确实是您应该学习的内容。
【解决方案2】:

这是代码中的答案,如果将来有人需要它,或者有兴趣。我不确定原始代码中的所有代码都在做什么,回头看,我可能应该研究更多的 SQL 语法。谢谢你的帮助,迈克。

if(isset($_COOKIE["usercookie"])) {
    if(isset($_COOKIE["IPcookie"])) {
        echo('Cookie detected, processing, wait a second.');
        if($_COOKIE["IPcookie"] == $_SERVER['REMOTE_ADDR']) {
            $cookieusername = $_COOKIE["usercookie"];
            $cookieresult = mysqli_query($connection, "SELECT * FROM users WHERE username='$cookieusername' AND active=1");

            if(!$cookieresult or mysqli_num_rows($cookieresult) == 0) {
                echo('We really don\'t believe your cookie is real, sorry.');           
            }
            else {
                $loginquery = mysqli_query($connection, "SELECT * FROM users WHERE username='$cookieusername'");
                $row5 = mysqli_fetch_assoc($loginquery);
                $dbIDlogin = $row5['ID']; 
                $_SESSION['userID'] = $dbIDlogin;
                session_write_close();
                header('Location: /userprofile.php');
            }   
        }   
        else {
            echo('We don\'t currently believe your cookie is real, sorry.');

        }
    }
    else {
        echo('We don\'t believe your cookie is real, sorry.');

    }
}

【讨论】:

    【解决方案3】:

    检查是否进入 if 语句。 如果不是,请检查 php.ini 中的“output_buffering”是否设置为“ON”

    【讨论】:

    • 上面的答案是我的答案,我已经找到了解决办法。不过谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多