【问题标题】:$_SESSION['user'] not working$_SESSION['user'] 不工作
【发布时间】:2011-09-12 02:40:24
【问题描述】:

所以这是记录的代码和我设置的地方

<?php 
    session_start();
    $_SESSION['user'] = "kjkj";
    $_SESSION['pass'] = "";  
    $error = $user = $pass = "";

    if (isset($_POST['user'])) {
        $user = sanitizeString($_POST['user']);
        $pass = sanitizeString($_POST['pass']);

     if ($user == "" || $pass == "") {
            $error = "Not all fields were entered<br />";
     } else {
            $query = "SELECT store,c_pass FROM store
                    WHERE store='$user' AND c_pass='$pass'";

            if (mysql_num_rows(queryMysql($query)) == 0) {
                $error = "Username/Password invalid<br />";
            } else {
            $_SESSION['user'] = $user;
                $_SESSION['pass'] = $pass;
            $str = $_SESSION['user'] . ", You are now logged in. Please 
                       <a href='scheduler.php'>click here</a>.";

                die($str);
            }
        }
    } ?>

它会在查询之后打印出正确的商店名称。但是当我尝试在像这样的另一个 php 文件中使用它时

if (!isset($_SESSION['user']) ) {
    die("<p><h1>Please Login</h1></p>");
} else {
    echo "<p><form id ='addemp' method=\"post\" action=\"addUser.php\">
          Name<input type=\"text\" name=\"emp\" />
      \"". $_SESSION['user'] . "\">
      <input type=\"submit\" value=\"AddUser\" />
    </form></p>";
}

这是一个空字符串。不为空,只是空字符串。我尝试了所有在互联网上可以找到的解决方案,但都没有奏效。我不知道为什么这不起作用。 任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 你把 session_start() 放到你的第二个文件里了吗?
  • 尝试在 $_SESSION 上运行 var_dump 以查看代码中不同点的样子。据我所知,切换文件不应该吹走会话数据
  • start_session() 也被添加到第二个文件中
  • 我建议阅读有关用户管理的教程,例如tutorialized.com/view/tutorial/PHP-Membership-System/67102 您现在获得它的方式非常脆弱,容易出现错误和安全漏洞。 OWASP 也是你的朋友。 owasp.org/index.php/Category:OWASP_PHP_Project
  • 你应该只运行一次 session_start()

标签: php session-variables


【解决方案1】:

您需要在使用$_SESSION 之前致电session_start()。另请注意,在会话中保留密码是一种非常糟糕的做法,也是一个很大的安全漏洞。

【讨论】:

    【解决方案2】:

    这可能是很多事情。首先,会话是否在其他时间工作? 我认为您没有为我们提供足够的信息来帮助您。这可能是 apache/php 设置的问题,而不仅仅是您的代码。之前在我使用 WAMP 和 temp 文件夹没有正确权限的 Windows 上进行开发时发生在我身上。正如我所说,可能有许多问题会导致您的会话行为不端。

    • 当您执行计数器并刷新时 页面是否保留数字?
    • 在 开始每次使用您需要的会话 session_start() 方法被调用。 重要提示:之前不能有任何回声或打印等 session_start()。
    • 将var_dump($user) 放在$_SESSION['user'] = $user; 之前,并在保存之前检查$user 的内容。可能是您的消毒功能无法正常工作。在第一个脚本的末尾也这样做,以查看 $_SESSION 的内容,以确保正确保存变量。

    【讨论】:

    • 我在我的域和服务器上使用 fatcow.com,所以我认为它设置正确。 session_start() 是在我的代码中添加的第一件事。
    • @Monir 如果你 var_dump 在第一个文件(设置所有会话的文件)的末尾。你能看到正确的值吗?如果您可以使用&lt;?php session_start(); var_dump($_SESSION); ?&gt; 创建一个新文件,看看您是否真的可以看到预期值。
    • 另外,如果我是你,我会做一个快速测试。使用&lt;?php session_start(); $_SESSION['test'] = "works"; ?&gt; &lt;a href="get.php"&gt;Go to get&lt;/a&gt; 设置文件set.php,使用&lt;?php session_start(); var_dump($_SESSION); ?&gt; 设置一个名为get.php 的文件。然后转到 set.php 并单击 Go 以获取链接以查看是否看到 test=&gt;works。
    • 好的,我运行了 var_dump 并登录,一切正常。对于另一个文件,我得到非常奇怪的错误。它有时对文件开头的 var_dump 有效,有时则无效。在我需要用户的地方,它永远不会起作用。立即尝试您的测试
    • 好的,测试有效,我也意识到 $_SESSION['pass'] 总是有效的。它只是用户不工作。每次用户关闭连接(即离开我的网站)时,如何销毁会话?
    【解决方案3】:

    如果您声称在该页面中也插入了 session_start(),请执行 2 件事:

    1) 更正你的 html,这一行。

    echo "<p><form id ='addemp' method=\"post\" action=\"addUser.php\">
              Name<input type=\"text\" name=\"emp\" />
          \"". $_SESSION['user'] . "\">
    

    有些事情不是很清楚。您将 $_SESSION 回显到哪里?是不是您的浏览器无法渲染它?你想完成什么?可能是浏览器对结束标记&gt; 的解释错误。先尝试整理html。 如果那是输入字段值,请写

    Name <input type=\"text\" name=\"emp\" value=\"".$_SESSION['user']."\"/>
    

    2) var_dump $_SESSION['user'] 看看它是否真的是一个空字符串。

    if (!isset($_SESSION['user']) ) {
        die("<p><h1>Please Login</h1></p>");
    } else {
        var_dump($_SESSION['user']);
    }
    

    【讨论】:

    • 1) 用于调试目的,不久后我将其删除。 var_dump 揭示了更奇怪的问题,在卢克的回答下检查 cmets
    【解决方案4】:

    听起来 OP 的 register_globals 有问题。

    在 php.ini 中设置register_globals = Off,然后再试一下代码。

    我遇到了完全相同的问题 - 我在会话中有一个用户变量,然后设置 $user = array(); 并发现 $user 变量正在覆盖 $_SESSION['user'] 变量。禁用 register_globals 修复它。

    或者您可以将 $user 变量更改为 $myUser 之类的变量,但最好还是禁用 register_globals。

    【讨论】:

      【解决方案5】:

      基于@kpaulsen 的回答,

      我遇到了同样的情况,$variable 覆盖了 $_SESSION['variable'] 所以我听从了他的建议,但它对我不起作用,然后我发现了另一种设置 register_globals = Off 的方法

      在 .htaccess 中添加这一行

      php_flag register_globals off
      

      【讨论】:

        【解决方案6】:

        也许这是我前段时间遇到的一个问题,所有代码都完美,但忘记在连接脚本中插入session_start();,女巫收到登录$_POST['somevariable'] 以使用数据库验证。

        在恢复时,不要忘记在连接时启动会话。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-28
          • 1970-01-01
          • 2015-03-08
          相关资源
          最近更新 更多