我正在尝试学习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;
}
}
}
?>
只需要稍微扩展你的代码。
目前,您的查询仅显示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"
如果你要这样做,Id 建议将:email
持有者更改为更明智的东西,如 :user
这样阅读代码更有意义。
编辑
您需要让您的 get_user_hash()
函数完整地返回$row
,然后从那里添加您的会话 var。 它有点从后到前,因为这可能不是我见过的最好的登录脚本。
在 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()
使用它来比较数据库中的加密密码。