【问题标题】:Issue regarding PHP $_SESSION variables关于 PHP $_SESSION 变量的问题
【发布时间】:2010-09-15 08:50:38
【问题描述】:

我有一个从数据库中抓取散列密码的登录表单。如果“提交检查”<input type="hidden"> 等于 1(下面的示例将更好地解释这一点),则显示页面内容,如果不等于 1,则显示登录表单。形式如下:

<div id="login" style="<?php echo $style ?>"> //$style is by default "visibility:visible;" but will change to "visibility:hidden;" when correct login info is given
<p>Log in</p>
<form method="POST" action="<?php echo $_SERVER['PHP_SELF'] ?>">
<input type="text" id ="username" name="username" value="Username" onfocus="if (this.value == 'Username') this.value=''">
<input type="password" id="password" name="password" value="passpass" onfocus="if (this.value == 'passpass') this.value=''">
<br>
<input type="submit" name="submit" value="Log Ind">
<input type="hidden" name="_submit_check" value="1"> //Submit checker. if set, process login information
</form>
</div>
<p>No user? Make one <a href="register.php">here.</a></p>
</div>

这对我的 PHP 示例很有效,但有一点令人讨厌……每次查看页面时,您都必须登录。因此我在我的 PHP 脚本中这样做了:

<?php

    session_start();

    $db = DB::connect('mysql://username:pass@host/database');
    if (DB::isError($db)){
        die("Can't connect: " . $db->getMessage());
    }
$style = "visibility:visible;";

$passwordHash = sha1($_POST['password']);
$_SESSION['login'] = $_POST['_submit_check']; //This is the submit checker I mentioned before

$sql = 'SELECT username FROM user WHERE username = ? AND passwordHash = ?';
$result = $db->query($sql, array($_POST['username'], $passwordHash));
if ($_SESSION['login'] == 1) {
    if ($result->numRows() < 1)
    {
        echo '<p>Correct your username and password please</p>';
    }
    else {
        $style = "visibility: hidden;";
        echo '<p>This is the page content</p>';
    }
}
?>

我将 $_POST['_submit_check'] 值添加到名为 'login' 的 $_SESSION[] 变量中的事实不应该使用户只需要每 24 分钟登录一次吗?这就是我想要的,但它没有发生......

希望您能理解我的问题,如果没有,请对您不理解的地方发表评论。我很难解释我在这个问题上的想法;)

【问题讨论】:

    标签: php session-variables


    【解决方案1】:

    您正在覆盖每个请求的 $_SESSION['login'],因为您在分配 $_POST 值时没有检查它是否真的设置了。

    if(isset($_POST['_check_submit'])) {
       $_SESSION['login'] = $_POST['_check_submit'];
    }
    

    【讨论】:

    • 仍然无法正常工作...与以前相同的输出:它登录,当我转到另一个页面并返回时,必须再次登录:(如果我做对了,字符串/变量存储在里面在接下来的 24 分钟内(默认情况下),所有页面(使用 session_start())都可以访问 SESSION 变量,对吗?
    • 嗯,因为您需要在每个请求中发布用户名和密码。您应该重新考虑您的身份验证系统。
    【解决方案2】:

    我不能 100% 确定,因为没有给出其他代码,但您似乎错过了启动或加载会话所需的对 session_start() 的调用。可悲的是,$_SESSION 不够神奇,无法代表您开始会话。如果没有此调用,$_SESSION 在每个脚本的开头将是空的,并且永远不会被初始化为会话数据。

    话虽如此,可以使用session.auto_start php.ini 指令将PHP 配置为为每个脚本自动启动会话,前提是您有足够的控制权来更改它。

    【讨论】:

      最近更新 更多