Php 如何获取用户名和匹配id作为会话?

Php 如何获取用户名和匹配id作为会话?,php,mysql,session,Php,Mysql,Session,我试图从任何登录的用户获取不同的统计数据。然后将这些数据重复出来。当前登录时,我正在使用用户名设置会话。然后我尝试从这个用户名获取id,并再次检查具有相同id的表,然后从该表获取行 我的猜测是,由于我在登录时仅使用用户名启动会话,因此获取数据的代码无法工作,因为会话不提供id行。我不确定如何让它做到这一点,或者我的看法是否正确 我感谢所有的帮助,我真的被困在这里了 这是我的登录代码: $query = "SELECT password FROM users WHERE username = '$

我试图从任何登录的用户获取不同的统计数据。然后将这些数据重复出来。当前登录时,我正在使用用户名设置会话。然后我尝试从这个用户名获取id,并再次检查具有相同id的表,然后从该表获取行

我的猜测是,由于我在登录时仅使用用户名启动会话,因此获取数据的代码无法工作,因为会话不提供id行。我不确定如何让它做到这一点,或者我的看法是否正确

我感谢所有的帮助,我真的被困在这里了

这是我的登录代码:

$query = "SELECT password FROM users WHERE username = '$username'";
    $result = mysqli_query($conn, $query);
    $row = mysqli_fetch_assoc($result);

    //USERDATA
    $dbPassword = $row['password'];

    if (password_verify($password, $dbPassword))
    {
        // echo "The details are correct.";
        $_SESSION['loggedin'] = $username;
    require_once('../../frontend/templates/account-actions.php');
    }
    else
    {
        echo "Passwords do not match!";
    }
这是我从登录用户名的id获取统计数据的代码:

$id = $_SESSION['loggedin'];
$query = "SELECT * FROM stats WHERE id='$id'";
$stmt = mysqli_query($conn, $query);
$result = mysqli_fetch_all($stmt,MYSQLI_ASSOC);

我已经用过程方法将您的代码转换为mysqli的Prepared语句

$username = "username_to_search";
$password = "password"; //Password is in plain text since password hash has been used.

$stmt = mysqli_prepare($conn, "SELECT * FROM users WHERE username = ?");

/* bind parameters for markers */
mysqli_stmt_bind_param($stmt, "s", $username); //"s" defines the type of data in the following variables, i.e. String for $username.

/* execute query */
mysqli_stmt_execute($stmt);

mysqli_stmt_store_result($stmt);

$total_rows = mysqli_stmt_num_rows($stmt);

mysqli_stmt_bind_result($stmt, $id_fetched, $username_fetched, $password_fetched); //store every field fetched from the table in sequence. Note that I have added _fetched to make it easier to identify later.

if ($total_rows > 0) {
    while(mysqli_stmt_fetch($stmt)) {
        if (password_verify($password, $password_fetched)) {
            $_SESSION['user_id'] = $id_fetched;
            $_SESSION['username'] = $username_fetched;

            require_once('../../frontend/templates/account-actions.php');
        }
        else {
            echo "Invalid Password!";
        }
    }
} else {
    echo "Invalid Username!";
}

一旦您正确地存储了会话变量,现在就可以轻松地找到与此相关的所有内容。使用您的
$\u会话[“用户id”]
进行搜索。

您的方法需要更正。通常,每个表中都有一个自动递增id。这将为每个条目提供唯一的值。用户表也是如此。现在登录时,存储登录用户的users表中的自动增量ID。所以至少可以说,选择*而不是选择密码。否在您的统计表中,将users表中的自动增量id存储在此处,以便建立关系。您是否在列表顶部创建了session_startpage@MohammedAkhtarZuberi当然,我的用户表中有一个自动递增的ID,我开始查看我的SELECT并按照您所说的进行更改。。你能更具体地说明我应该如何建立这种关系吗?我真的不明白如果我选择*而不是选择password,登录将如何验证密码?@MohammedAkhtarZuberi如果我也需要更改密码,我是对的吗$行=mysqli\u fetch\u assoc($result);取而代之的是获取全部,因为我没有执行SELECT*操作,所以您的代码容易受到SQL注入攻击。考虑使用PDO或准备好的语句和MySQL。选择*是选择所有字段。选择查询将自动选择与提供的条件匹配的所有条目。如果有进一步的疑问,请毫不犹豫地询问。非常感谢!!我有一个问题,你可以用密码散列而不是SHA1来更新吗?我已经用密码散列修改了代码。请注意,我没有在修改后测试它,但它应该可以工作。我收到这个错误,mysqli_stmt_bind_result():绑定变量的数量与第44行prepared语句中的字段数量不匹配检查表中的字段总数。正如我提到的,它们应该在括号中匹配。例如,您有id、用户名、密码和状态,所以在执行SELECT*时添加它们。或者,从中选择id、用户名、密码……好的,我解决了,我没有看到您在我的表中只输入了3个字段,而我还有一个电子邮件字段。所以我添加了email字段,现在它可以工作了!谢谢