我已经为我的网站完成了登录和注册,并且运行良好。
现在我只想制作一个简单的个人资料页面,用户可以在其中查看他们的所有详细信息。
我只能取回用户名,因此我不确定如何获取其其余详细信息。
以下是注册和登录的代码:
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/