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

标签 php mysql

我已经为我的网站完成了登录和注册,并且运行良好。

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

我只能取回用户名,因此我不确定如何获取其其余详细信息。

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

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>";
}

最佳答案

简单的答案是将您的查询替换为 selectUser(...)SELECT * FROM login WHERE username = :username 。请注意* SELECT之后命令,它充当通配符,因此要求它找到的每一行的每一列(而不是像您当前要求的那样仅 password 列。

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

关于良好实践的说明:

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

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

另外,警告一下,这个登录系统非常简单,很容易被欺骗。 PHP session 提供了一定的安全性,但并不完全可靠。嗅探器捕获 session cookie 将允许他们以嗅探 cookie 的用户身份登录。我建议您在实现了登录系统的其余部分后也考虑添加自己的 session 层。并且绝对使用 SSL。

关于优化的说明:

* 中使用通配符 ( SELECT )命令实际上是出现速度瓶颈的主要地方。如果您确切地知道想要从数据库中获得哪些列,最好明确地询问它们。例如,而不是 * ,你可以这样做password,occupation,role .

关于php - 工作网站的简单个人资料页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47892125/

相关文章:

php - PHP中两个不同时间相减

php - 无法连接服务器以从本地系统访问数据库

php - mysql - 行锁定和释放

mysql - 如何编写没有别名的sql查询

javascript - 使用 PHP 和 JS 更新表单值

php - 如何在 symfony 中创建自定义记住我提供程序

php - php中的foreach循环问题

c# - 如何在 C# 中修复 SQLite 查询?

javascript - 稍后存储大型 JSON 流水线请求

php - 通过函数选择查询..从数据库获取数据