初学者帮助:PHP MySQL (PDO) 函数



我正在尝试学习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()使用它来比较数据库中的加密密码。

最新更新