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

初学者帮助:PHP MySQL(PDO)函数,php,mysql,pdo,Php,Mysql,Pdo,我正在尝试学习PHP并建立一个基于用户访问的网站。我终于找到了一个使用和实现起来非常简单的模板。然而,经过数小时的努力修改模板后,我不得不请求帮助 下面的代码非常有效,我修改了原始模板,可以使用电子邮件地址作为用户名和数据库中存储的密码登录。原始模板基于用户名登录,而不是使用电子邮件地址。我现在试图实现的是,以某种方式还包括来自同一数据库和表的字段“username”,并将其存储为$username参数,以便在站点的其他位置使用,例如使用“echo”。我希望仍然使用该字段,但用于注册成员的名称,

我正在尝试学习PHP并建立一个基于用户访问的网站。我终于找到了一个使用和实现起来非常简单的模板。然而,经过数小时的努力修改模板后,我不得不请求帮助

下面的代码非常有效,我修改了原始模板,可以使用电子邮件地址作为用户名和数据库中存储的密码登录。原始模板基于用户名登录,而不是使用电子邮件地址。我现在试图实现的是,以某种方式还包括来自同一数据库和表的字段“username”,并将其存储为$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"
如果您打算这样做,我建议您将
:email
持有者更改为更合理的持有者,如
:user
,以便阅读代码更有意义

编辑

您需要使用
get\u user\u hash()
函数返回整个
$row
,然后从那里添加会话变量。这有点背对背,因为这可能不是我见过的最好的登录脚本

get\u user\u hash()
中,更改

 return $row['password'];

然后在函数登录中

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;
    }   
}

实际上,
$hash
只不过是用户密码,
password\u verify()
用于比较数据库中的加密密码。

欢迎使用Stackoverflow!我想问几个问题。1.将来你能不能把“初学者帮助”这样的东西放在标题里?2.当你说:*我一直收到错误信息*,你能具体说明你收到的错误吗?谢谢。我对此表示歉意,并将确保在以后的帖子中牢记这一点。非常感谢您的回复。然而,我似乎无法让它工作,我认为问题是我不知道把:$_会话['username]=$row['username']放在哪里;更新答案。试试看。如果答案对你有用,请接受。祝你好运。太好了,非常感谢你的帮助和快速反应。我希望有一天我也能在这个领域伸出援助之手。
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;
    }   
}