我正在尝试学习PHP并设置基于用户访问的网站。我终于找到了一个大多数使用和实现简单的模板。然而,经过数小时努力修改模板后,我不得不寻求帮助。
以下代码效果很好,我修改了原始模板,以便能够使用电子邮件地址作为用户名和数据库中存储的密码进行登录。原始模板基于用户名登录而不是使用电子邮件地址。我现在想要实现的是以某种方式还包括字段"用户名"来自同一个数据库和表,并将其存储为$ username参数,以便在网站的其他位置使用,例如使用" echo"。我仍然希望使用该字段,但是使用注册会员的名称,而不是登录用户名。
我确信有一种简单的方法,但无论我改变什么,我都会收到错误消息,而我似乎还不明白语法。
<?php
include('password.php');
class User extends Password{
private $_db;
function __construct($db){
parent::__construct();
$this->_db = $db;
}
private function get_user_hash($email){
try {
$stmt = $this->_db->prepare('SELECT password FROM members WHERE email = :email AND active="Yes"');
$stmt->execute(array('email' => $email));
$row = $stmt->fetch();
return $row['password'];
} catch(PDOException $e) {
echo '<p class="bg-danger">'.$e->getMessage().'</p>';
}
}
public function login($email,$password){
$hashed = $this->get_user_hash($email);
if($this->password_verify($password,$hashed) == 1){
$_SESSION['loggedin'] = true;
return true;
}
}
public function logout(){
session_destroy();
}
public function is_logged_in(){
if(isset($_SESSION['loggedin']) && $_SESSION['loggedin'] == true){
return true;
}
}
}
?>
答案 0 :(得分:0)
您只需稍微扩展您的代码。
此时您的查询只显示1个字段,即密码。
SELECT * FROM members WHERE email = :email AND active="Yes"
这将返回整行,而不仅仅是一个字段。
然后,您可以提取用户名并将其放入会话变量中,如下所示:$_SESSION['username'] = $row['username'];
然后您可以在整个网站的其余部分使用它。确保在您要访问会话变量的所有文件的开头都有session_start();
。如果您要使用其他字段,只需将参数更改为'firstName'
或'fullName'
或任何字段被调用。
作为额外的一点,您还可以扩展您的查询以允许用户通过添加此电子邮件或其用户名登录。
SELECT * FROM members WHERE (email = :email OR username = :email) AND active="Yes"
如果您打算这样做,我建议您将:email
持有人更改为:user
更合理的内容,以便更有意义地阅读代码。
修改强>
您需要让get_user_hash()
函数完整地返回$row
,然后从那里添加会话变量。它有点回到前面,因为这可能不是我见过的最好的登录脚本。
在get_user_hash()
中,更改
return $row['password'];
到
return $row;
然后在函数登录中,
public function login($email,$password){
$row = $this->get_user_hash($email);
$hashed = $row['password'];
if($this->password_verify($password,$hashed) == 1){
$_SESSION['username'] = $row['username'];
$_SESSION['loggedin'] = true;
return true;
}
}
实际上,$hashed
只不过是password_verify()
用于比较数据库中加密密码的用户密码。