我已经为我的网站进行了登录和注册,并且工作正常。
现在我只想制作一个简单的个人资料页面,用户可以在其中查看所有详细信息。
我只能取回用户名,所以我不确定如何获取其余的详细信息。
以下是注册和登录的代码:
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>";
}
答案 0 :(得分: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)查看用户是否可以成功登录&#34;。然后,您可以将返回的行的唯一ID缓存到您的会话中,然后根据需要对其他信息进行后续查询...例如用户的角色或联系号码。这有效地将所有查询处理的复杂性从线性时间降低到恒定时间......对于应用程序来说,这是一个次要的,但仍然是非平凡的改进。
另外,作为警告,此登录系统非常简单且容易欺骗。 PHP会话提供了一些安全性,但它们并不是完全可靠的。嗅探会话cookie的嗅探器将允许他们以他们嗅探它的用户身份登录。一旦您实现了其余的登录系统,我建议您考虑添加自己的会话层。绝对使用SSL。
关于优化的说明:
在*
命令中使用通配符(SELECT
)实际上是发生速度瓶颈的主要场所。如果您确切地知道数据库中要包含哪些列,则最好明确地询问它们。例如,您可以*
代替password,occupation,role
。
答案 1 :(得分:0)
$ _ SESSION [&#39;用户名&#39;] = $ username; 您在会话权限中拥有用户名。 只需将此值传递给mysql的where条件。并从登录表中获取整个记录。只显示您想要显示的位置。
答案 2 :(得分: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;
}
}
答案 3 :(得分:0)
您可以更改SELECT
语句,以返回要存储在$_SESSION
变量中的其他值,然后使用$row->{variable}
确保在进行密码检查后填写$_SESSION