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