工作网站的简单个人资料页面

问题描述 投票:0回答:4

我已经为我的网站登录并注册了,它运行正常。

现在我只想制作一个简单的个人资料页面,用户可以在其中查看所有详细信息。

我只能取回用户名,所以我不确定如何获取其余的细节。

以下是注册和登录的代码:

function selectUser($conn, $username, $password)
{
    $query = "SELECT password FROM login WHERE username = :username"; 
    $stmt = $conn->prepare($query);
    $stmt->bindValue(':username', $username);

    $stmt->execute();

    if ($row = $stmt->fetch(PDO::FETCH_OBJ))
    {
        if (md5($password) == $row->password)
        {  
            $_SESSION['username'] = $username;
            //$_SESSION['password'] = $password; DO NOT DO THIS
            echo "Welcome, you are now logged in as " . $username; 
            return true;
        }
        return false; 
    } else  {
        //echo "Your details were not found";
        return false;
    }
}

function selectNew($conn, $name, $username, $password, $contact, $occupation, $role, $picture)
{
    $query = "INSERT INTO login VALUES (NULL, :name, :username, :password, :contactNumber, :occupation, :role, :pic)";

    $stmt = $conn->prepare($query);
    $stmt->bindValue(':name', $name);
    $stmt->bindValue(':username', $username);
    $stmt->bindValue(':password', $password);
    $stmt->bindValue(':contactNumber', $contact);
    $stmt->bindValue(':occupation', $occupation);
    $stmt->bindValue(':role', $role);
    $stmt->bindValue(':pic', $picture);
    $affected_rows = $stmt->execute();

    if ($affected_rows == 1)
    {
        return true;
    } else {
        return false;
    }
}

别担心,密码已被哈希。

继承人我试过的:

function selectUser($conn, $username, $password)
{
    $query = "SELECT * FROM login WHERE username = :username"; 
    $stmt = $conn->prepare($query);
    $stmt->bindValue(':username', $username);
    $stmt->execute();
    $row = $stmt->fetch();
    echo $row['occupation'];
    echo $row['role'];
}

第二次尝试:

if(isset($_SESSION["username"]))
{
    echo "Welcome, you are now logged in as <b>".$_SESSION['username']."</b> <img class='clientView' src='images/loginIcon.png' alt='client'>"; }
    else { 
    echo "You are currently not logged in";
}

$user   = $_SESSION["username"];

$query = "SELECT * FROM login WHERE username = :username"; 

$term = $conn->prepare($query);
$term->bindValue(':username', $user);
$term->execute();

if ($username = $term->fetch(PDO::FETCH_OBJ))
{
    echo "<li><h3>" . $user->username ." ". $user->user_ID . "</h3></li>";
}
php mysql
4个回答
0
投票

简单的答案是用selectUser(...)替换SELECT * FROM login WHERE username = :username中的查询。请注意*命令之后的SELECT,它充当外卡,因此会询问它找到的每一行的每一列(而不仅仅是您当前要求的password列)。

然后,当您迭代返回的行时,可以通过$row变量访问用户的其他列。就像您使用$row->password访问用户的哈希密码一样,您可以访问$row->contactNumber

关于良好做法的说明:

根据具体情况,我不建议在登录时使用通配符(*SELECT命令。实际上,我建议在查询之前简单地对密码进行哈希处理,然后尝试使用WHERE username = :username AND password = :password限定查询(显然,将哈希密码绑定到:password)。您可以SELECT行的唯一ID,而不是要求输入密码列或通配符列。

这样,您根本不需要迭代返回的行...您只需要确保返回任何行(请参阅num_rows)以查看用户是否可以成功“登录”。然后,您可以将返回的行的唯一ID缓存到会话中,然后根据需要对其他信息进行后续查询...例如用户的角色或联系号码。这有效地将所有查询处理的复杂性从线性时间降低到恒定时间......对于应用程序来说,这是一个次要的,但仍然是非平凡的改进。

此外,作为警告,这个登录系统非常简单,容易欺骗。 PHP会话提供了一些安全性,但它们并不是完全可靠的。嗅探会话cookie的嗅探器将允许他们以他们嗅探它的用户身份登录。一旦您实现了其余的登录系统,我建议您考虑添加自己的会话层。绝对使用SSL。

关于优化的说明:

*命令中使用通配符(SELECT)实际上是发生速度瓶颈的主要场所。如果您确切地知道数据库中要包含哪些列,则最好明确地询问它们。例如,你可以做*而不是password,occupation,role


0
投票

$ _SESSION ['username'] = $ username;您在会话权限中拥有用户名。只需将此值传递给mysql的where条件。并从登录表中获取整个记录。只显示您想要显示的位置。


0
投票

您可以更改SELECT语句以返回要存储在$_SESSION变量中的其他值,然后使用$row->{variable}访问它们

确保在进行密码检查后填写$_SESSION


0
投票

与您现有的代码没有什么不同 - 使用您在用户登录时设置的会话变量

$username=!empty( $_SESSION['username'] ) ? $_SESSION['username'] : false;
$sql='select * from `login` where `username`=:username;';

$stmt=$conn->prepare( $sql );
if( $stmt && $username ){
    $stmt->bindValue(':username',$username);
    $result=$stmt->execute();
    if( $result ){
        $rs=$stmt->fetchAll( PDO::FETCH_OBJ );
        /* display results from $rs */
        /*
            There should most likely only be one record!!
        */
        $row=$rs[0];

        foreach( $row as $column => $value )echo $column.' '.$value;

    }
}
© www.soinside.com 2019 - 2024. All rights reserved.