无法在PHP中注销[重复]

问题描述 投票:4回答:3

这个问题在这里已有答案:

我正在尝试在PHP中进行注册/登录表单,但是我无法注销。我一直收到以下错误。

致命错误:未捕获ArgumentCountError:函数USER :: __ construct()的参数太少,0在第4行传递给C:\ xampp \ htdocs \ recepten \ logout.php,在C:\ xampp \ htdocs \ recepten \中预期为1 class.user.php:6堆栈跟踪:#0 C:\ xampp \ htdocs \ recepten \ logout.php(4):USER - > __ construct()#1 {main}抛出C:\ xampp \ htdocs \ recepten \第6行的class.user.php

有人可以告诉我我正在做什么以及如何解决问题?

这是我的注销脚本代码:

<?php
session_start();
require_once 'class.user.php';
$user = new USER();

if(!$user->is_logged_in())
{
    $user->redirect('indexlogin.php');
}

if($user->is_logged_in()!="")
{
    $user->logout(); 
    $user->redirect('indexlogin.php');
}
?>

这是我的call-user脚本代码:

<?php
class USER
{
    private $db;

    function __construct($DB_con)
    {
        $this->db = $DB_con;
    }

    public function register($fname,$lname,$uname,$umail,$upass)
    {
       try
       {
           $new_password = password_hash($upass, PASSWORD_DEFAULT);

           $stmt = $this->db->prepare("INSERT INTO users(user_name,user_email,user_pass) 
                                                       VALUES(:uname, :umail, :upass)");

           $stmt->bindparam(":uname", $uname);
           $stmt->bindparam(":umail", $umail);
           $stmt->bindparam(":upass", $new_password);            
           $stmt->execute(); 

           return $stmt; 
       }
       catch(PDOException $e)
       {
           echo $e->getMessage();
       }    
    }

    public function login($uname,$umail,$upass)
    {
       try
       {
          $stmt = $this->db->prepare("SELECT * FROM users WHERE user_name=:uname OR user_email=:umail LIMIT 1");
          $stmt->execute(array(':uname'=>$uname, ':umail'=>$umail));
          $userRow=$stmt->fetch(PDO::FETCH_ASSOC);
          if($stmt->rowCount() > 0)
          {
             if(password_verify($upass, $userRow['user_pass']))
             {
                $_SESSION['user_session'] = $userRow['user_id'];
                return true;
             }
             else
             {
                return false;
             }
          }
       }
       catch(PDOException $e)
       {
           echo $e->getMessage();
       }
   }

   public function is_loggedin()
   {
      if(isset($_SESSION['user_session']))
      {
         return true;
      }
   }

   public function redirect($url)
   {
       header("Location: $url");
   }

  public function logout()
  {
      session_destroy();
      $_SESSION['user_session'] = true;
  }
}
?>

如果有人可以提供帮助,那就太好了!

php mysql pdo
3个回答
3
投票

class.user.php你有一个:

function __construct($DB_con)
{
  $this->db = $DB_con;
}

当你在logout.php中使用它时:

$user = new USER();

你必须将$DB_con传递给__constructor,或创建一个没有参数的__constructor,并添加另一个函数来初始化DB

function __construct()
{
} 
public function initDB($DB_con)
{
  $this->db = $DB_con;
}

然后你就可以这样使用它:

$YourDB = whatever_get_DB();
$user = new USER();
// And when you need:
$user.initDB($YourDB);

或者没有这个:

$YourDB = whatever_get_DB();
$user = new USER($YourDB);

1
投票

您必须将DB连接传递给USER构造函数。


0
投票

抛出的错误非常清楚。你在构造函数中缺少一个参数,期望1得到0个参数。

因此,基本上在实例化类new ClassName()时,构造函数参数放在括号中。

//               v Arguments of the constructor goes here 
$user = new USER( );

在您的情况下,您缺少类构造函数需要的参数($DB)

© www.soinside.com 2019 - 2024. All rights reserved.