邮件确认 - 令牌无效
Mail confirmation - invalid token
我从昨天开始就在处理令牌确认问题。
所以该网站应该给我发一封电子邮件,其中有 ID 和令牌。
但是当我在 URL 时,它显示无效令牌,我不明白为什么
这是一些代码
confirm.php
<?php
require '../class/Bootstrap.php';
$db = App::getDatabase();
$auth = new Auth($db);
if($auth->confirm($_GET['id'],$_GET['token'], Session::getInstance())){
Session::getInstance()->setFlash('success',"OK, valid account");
App::redirect('../account.php');
}
else{
Session::getInstance()->setFlash('danger',"Invalid token");
App::redirect('login.php');
}
会话 class
class Session{
static $instance;
static function getInstance(){
if(!self::$instance){
self::$instance = new Session();
}
return self::$instance;
}
public function write($key, $value){
$_SESSION[$key] = $value;
}
public function read($key){
return isset($_SESSION[$key]) ? $_SESSION[$key] : null;
}
public function delete($key){
unset($_SESSION[$key]);
}
授权 class
public function confirm($user_id,$token, $session){
$user = $this->db->query('SELECT * FROM users WHERE id = ?', [$user_id]);
if($user && $user->confirmation_token == $token ){
$this->db->query('UPDATE users SET confirmation_token = NULL, confirmed_at = NOW() WHERE id = ?', [user_id]);
$session->write('auth',$user);
return true;
}
return false;
}
有人可以告诉我哪里错了吗?谢谢
PDO::query
不将数据作为第二个参数。所以它不能用于准备好的语句。
您想使用 PDO::prepare
with PDOStatement::execute
:
$sth = $this->db->prepare('SELECT * FROM users WHERE id = ?');
$sth->execute(array($user_id));
我从昨天开始就在处理令牌确认问题。 所以该网站应该给我发一封电子邮件,其中有 ID 和令牌。 但是当我在 URL 时,它显示无效令牌,我不明白为什么
这是一些代码
confirm.php
<?php
require '../class/Bootstrap.php';
$db = App::getDatabase();
$auth = new Auth($db);
if($auth->confirm($_GET['id'],$_GET['token'], Session::getInstance())){
Session::getInstance()->setFlash('success',"OK, valid account");
App::redirect('../account.php');
}
else{
Session::getInstance()->setFlash('danger',"Invalid token");
App::redirect('login.php');
}
会话 class
class Session{
static $instance;
static function getInstance(){
if(!self::$instance){
self::$instance = new Session();
}
return self::$instance;
}
public function write($key, $value){
$_SESSION[$key] = $value;
}
public function read($key){
return isset($_SESSION[$key]) ? $_SESSION[$key] : null;
}
public function delete($key){
unset($_SESSION[$key]);
}
授权 class
public function confirm($user_id,$token, $session){
$user = $this->db->query('SELECT * FROM users WHERE id = ?', [$user_id]);
if($user && $user->confirmation_token == $token ){
$this->db->query('UPDATE users SET confirmation_token = NULL, confirmed_at = NOW() WHERE id = ?', [user_id]);
$session->write('auth',$user);
return true;
}
return false;
}
有人可以告诉我哪里错了吗?谢谢
PDO::query
不将数据作为第二个参数。所以它不能用于准备好的语句。
您想使用 PDO::prepare
with PDOStatement::execute
:
$sth = $this->db->prepare('SELECT * FROM users WHERE id = ?');
$sth->execute(array($user_id));