【问题标题】:Session variables not working? (PHP)会话变量不起作用? (PHP)
【发布时间】:2015-09-30 18:41:14
【问题描述】:

我遇到了 2 个文件的问题:login_config.phpprofile.php

  • login_config.php 包含一个登录系统,它在完成多种形式的身份验证后将 $_SESSION['key'] 设置为 true。
  • profile.php 是用户成功后重定向到的页面。

我希望 profile.php 上的数据只能通过设置 $_SESSION['key'] 访问(成功登录后)。

我的问题:我的代码有什么问题?此外,为什么我在登录提交时出现错误,该错误仅在 $_SESSION['key'] 为 false/未设置时才返回,而不是目标 profile.php 页面?

代码:(login_config.php)

<?php

// POST VARIABLES
$submit = $_POST['login_submit'];
$username = $_POST['login_username'];
$password = $_POST['login_password'];
$email = $_POST['login_email'];

require 'password_config.php';

if(isset($submit)){

    require 'db/connect.php';

    // PASSWORD VERIFYING
    $pass_query = "SELECT password FROM users WHERE email='$email'";
    $queried = mysql_query($pass_query);
    while($row = mysql_fetch_array($queried)){
        $user_pass = $row['password'];
        $veri_password = password_verify($password, $user_pass);
    }
    if(!$veri_password === true){$errors[] = '-Account does not exist ';}

    // CHECKING NUM ROWS
    $sql = "SELECT id, username FROM users WHERE password='$user_pass' AND email='$email'";
    $entered_user = mysql_query($sql);
    $num_rows = mysql_num_rows($entered_user);


    // ERRS ARRAY ESTABLISHED
    $errors = array();

    // FURTHER VERIFYING
    if( empty($password) || empty($email) )
    {
        $errors[] = 'Please do not leave fields empty';
    }
    elseif( $num_rows != 1 )
    {
        $errors[] = '-Account does not exist ';
    }
    elseif( $num_rows == 1 )
    {
        session_start();
        $_SESSION['key'] === true;

        while($row = mysql_fetch_array($entered_user)){
            $_SESSION['id'] = $row['id'];
            $_SESSION['email'] = $email;
            $_SESSION['user'] = $row['username'];
            $_SESSION['pass'] = $password;
            header('Location: profile.php');
            exit();
        }

    }
}   

代码:(profile.php)

<?php

session_start();

if($_SESSION['key'] !== true){
    die ("please <a href='login.php'>log in</a> to view this page");
}
?>
<html>
<head>
    <title>Profile</title>
    <link href='css/main.css' rel='stylesheet' />
</head>
<body>
    <div id='container'>
        <?php require 'include/header.php'; ?>
        <?= 'NJM ID # ==>'.$_SESSION['id'].'<br />'.'Username ==>'.$_SESSION['user'].'<br/>'.'Password ==>'.$_SESSION['pass'].'<br/>'.'<br />' ?>
        <a href='logout.php'>Log out!</a>
        <br />
        -OR-
        <br />
        <p>Try our beta mode<a href='forum.php'> forum</a></p>
        <?php require 'include/footer.php'; ?>
    </div>
</body>
</html>

注意:我知道在当前代码状态下我很容易受到 SQL 攻击,我稍后会修复这个问题,而且我还坚持使用已弃用的 MySQL 版本。

【问题讨论】:

  • 另外,提前感谢您的帮助 -Eugene
  • 不完全确定为什么这个问题被否决了。仍未收到解决方案。
  • 您可以缩进您的代码并更具体地了解您遇到的错误。注释您的代码以显示逻辑失败的位置以及您期望看到的/实际看到的内容
  • session_start(); 应该总是首先开始,在渲染后你不能这样做,它是代码,它是 html。它是需要打开的第一件事。所以你应该在设置变量之前使用它。一个 sessin 总是处于活动状态,不管你是否使用它,是或否。另外,我建议在设置会话后对会话进行 var 转储并检查变量是否已保存。因为您的会话是否保存任何内容?是否仅在您的其余页面中出现?

标签: php mysql session


【解决方案1】:

profile.php 中,您必须先致电session_start();,然后才能使用$_SESSIONsession_start() 不仅会启动一个新会话,还会继续一个现有会话(如果您愿意,它会“启动”会话处理功能)。不调用就不能使用$_SESSION

【讨论】:

    【解决方案2】:

    第一个:我会使用三元运算符来检查我需要的值是否存在,以避免“未定义索引'login_username'”错误。像这样:

    $username = isset($_POST['login_username']) ? $_POST['login_username'] : '';
    $password = isset($_POST['login_password']) ? $_POST['login_password']) : '';
    $email = isset($_POST['login_email']) ? $_POST['login_email'] : '';
    

    第二个:出于安全原因,我会使用 PDO 连接 MySQL 服务器。

    session_start();
    
    if (isset($submit)){
        // select all data from db for the current user
        $st = $db->prepare('SELECT * FROM users WHERE email=?');
        $st->execute([$email]);
        //$rows = count_rows_here
        if($rows == 1){
            $row = $stmt->fetch();
            if(password_verify($password, $row['pass'])){
                $_SESSION['key'] = true; // notice the '=', and not '==='
                $_SESSION['id'] = $row['id'];
                $_SESSION['email'] = $row['email'];
                $_SESSION['user'] = $row['username'];
                $_SESSION['pass'] = $row['password'];
                header('Location: profile.php');
           } else {
               echo 'Error!';
           }
       }
    }
    

    【讨论】:

    • 以前从未听说过三元经营者,会去看看!
    【解决方案3】:

    我已通过为 $_SESSION['key'] 分配一个具有值的变量来解决此问题。

    $_SESSION['key'] = $check = 'check';
    

    然后为了在profile.php中测试这个,我输入了以下代码:

    if(isset(!$_SESSION['key'])){die ('example')}
    

    【讨论】:

      【解决方案4】:

      在您转到下一个 PHP 页面后,我会先尝试删除 exit() 调用。没有必要,因为它下面没有代码,它可能会影响会话(但我不这么认为)

      如果这不起作用(可能不会)在您开始会话 var_dump($_SESSION) 并查看/发布其内容后添加到 profile.php

      【讨论】:

      • 这里是 var_dump($_SESSION) 的结果: array(5) { ["id"]=> string(2) "89" ["email"]=> string(8) " uyuyuyuy" ["user"]=> string(8) "uyuyuyuy" ["pass"]=> string(10) "uyuyuyuyuy" ["username"]=> string(8) "uyuyuyuy" } 请登录查看本页
      • 想补充的是,以上是随机账户
      • 是的,您的问题很明显 - 会话中没有名为“key”的键
      猜你喜欢
      • 2013-11-10
      • 2012-08-17
      • 2014-05-16
      相关资源
      最近更新 更多