【问题标题】:Sessions are not getting declared会话没有被宣布
【发布时间】:2017-05-03 17:54:08
【问题描述】:

这是我的登录密码

global $connection;

if (isset($_POST['user_login'])) {

    $email = $_POST['email'];
    $password = $_POST['password'];
    $password= md5($password);

    $login = mysqli_query($connection, "SELECT * FROM user WHERE email ='{$email}' AND password = '{$password}' ");
    if(!$login) {
        die("QUERY FAILED" . mysqli_error($connection));
    }

    if(!$login || mysqli_num_rows($login) == 0) {

        echo "<div class='alert alert-danger' role='alert'> <strong>Your Username or Password is invalid!</strong></div>";

    } else {
        $_SESSION['user_id'] = $user_id;
        $_SESSION['email'] = $email;
        $_SESSION['username'] = $username;

        header('Location: index.php');
    }
}

我使用 print_r 函数显示所有会话,但只有会话电子邮件被声明。为什么没有声明 user_id 和用户名?我做错了什么?

【问题讨论】:

  • 您开始会话了吗?对我来说不像
  • 您的代码容易受到SQL injection 攻击。您应该使用mysqliPDO 准备好的语句和this post 中所述的绑定参数。
  • MD5 不足以进行密码散列。请改用password_hash()password_verify()
  • 或您的 POST 阵列失败。和$user_id
  • 您不会在任何地方定义$user_id$username。你认为他们来自哪里?

标签: php session session-variables


【解决方案1】:
  1. 您可能忘记在顶部声明session_start();
  2. 似乎您在会话中使用了user_idusername,但它们并未从您的PHP 代码中的任何位置获取。因此,您可能会忘记从您的$login 回复中获取并使用它们。

这是一个假设,因为您的代码看起来使用 user_idusername 基于SELECT 查询。

因此,您可以尝试使用此代码,该代码包含选择查询中使用的所有参数:

session_start();
global $connection;

if (isset($_POST['user_login'])) {

    $email = $_POST['email'];
    $password = $_POST['password'];
    $password= md5($password);

    $login = mysqli_query($connection, "SELECT * FROM user WHERE email ='{$email}' AND password = '{$password}' LIMIT 1");
    if(!$login) {
        die("QUERY FAILED" . mysqli_error($connection));
    }

    if(!$login || mysqli_num_rows($login) == 0) {

        echo "<div class='alert alert-danger' role='alert'> <strong>Your Username or Password is invalid!</strong></div>";

    } else {
        // get user_id and username fetched from your Select query
        while($row = $login->fetch_assoc()) {
          $_SESSION['user_id'] = $row['user_id']; // assuming user_id as a column
          $_SESSION['email'] = $email;
          $_SESSION['username'] = $row['username']; // assuming username as a column
        }
        header('Location: index.php');
    }
}

【讨论】:

  • 投反对票的人至少应该在这里解释原因? :)
  • 不是我的反对意见,而是倾倒一堆代码并说“试试这个”,添加关于更改的内容以及原因的解释,使答案变得更好 - 对于 OP 和未来读者。
  • @Satish Saini - 谢谢,让它工作。 :) 抱歉,他们不允许我投票。
  • @Qirel 已对其进行了更新,使其更加清晰!感谢您的评论,因为这确实使这个平台更加有用。
  • @Unknown:很高兴我能够追踪你的思想并给你预期的东西!干杯。
【解决方案2】:

当您尝试将未初始化的变量或空值放入会话时,会话不会引发异常。但是键值列表,不能添加非初始化变量或空值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-28
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多