Php 会话变量不工作?(菲律宾)

Php 会话变量不工作?(菲律宾),php,mysql,session,Php,Mysql,Session,我对两个文件有问题:login\u config.php和profile.php login_config.php由一个登录系统组成,该系统在完成多种形式的身份验证后将$\u会话['key']设置为true php是用户成功后重定向到的页面 我希望profile.php上的数据只能通过设置$_SESSION['key']来访问(在成功登录时) 我的问题:我的代码有什么错误?此外,为什么在提交登录时会出现错误,而只有当$\u SESSION['key']为false/未设置时才会返回,而不是目

我对两个文件有问题:
login\u config.php
profile.php

  • login_config.php由一个登录系统组成,该系统在完成多种形式的身份验证后将$\u会话['key']设置为true
  • php是用户成功后重定向到的页面
我希望profile.php上的数据只能通过设置$_SESSION['key']来访问(在成功登录时)

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

代码:(login_config.php)


轮廓

-或-
试试我们的测试模式


注意:我知道在当前的代码状态下,我很容易受到SQL攻击,我将在稍后修复此问题,而且我仍然使用不推荐的MySQL版本。

profile.php
中,您必须调用
session_start()$\u会话之前执行code>
session\u start()
不仅启动新会话,还将继续现有会话(如果愿意,它将“启动”会话处理功能)。如果不调用它,就不能使用
$\u SESSION

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


如果这不起作用(可能不会),请在启动会话
var\u dump($\u session)
并查看/发布其内容后将其添加到
profile.php

我已通过为$\u session['key']分配一个带有值的变量来修复此问题

$_SESSION['key'] = $check = 'check';
然后,为了在profile.php中测试这一点,我输入了以下代码:

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

第一:为了避免“未定义索引‘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!';
       }
   }
}

另外,提前感谢你的帮助——尤金不完全清楚这个问题为什么会被否决。仍然没有收到解决方案。您可以缩进代码,更具体地说明您遇到的错误。注释您的代码,以显示逻辑失败的地方以及您期望看到的/实际看到的内容
session_start()应该总是先开始,你不能在呈现了一些东西之后再开始,这些东西可能是代码,也可能是html。这是第一件需要打开的东西。所以你应该在设置变量之前使用它。会话始终处于活动状态,不管您是否使用它,是或否。此外,我建议您在设置会话后对会话进行var转储,并检查变量是否保存。因为你的会话保存了什么?这是否仅在页面的其余部分启用?以下是var\u dump($\u会话)的结果:数组(5){[“id”]=>字符串(2)“89”[“email”]=>string(8)“uyuy”[“user”]=>string(8)“uyuy”[“pass”]=>string(10)“uyuy”[“username”]=>string(8)“uyuy”}请登录查看此页面想补充一点,上面是一个随机帐户。您的问题很明显-会话中没有名为“key”的键。以前听说过术语运算符的人,都会查看它们!
$username = isset($_POST['login_username']) ? $_POST['login_username'] : '';
$password = isset($_POST['login_password']) ? $_POST['login_password']) : '';
$email = isset($_POST['login_email']) ? $_POST['login_email'] : '';
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!';
       }
   }
}