这个问题在这里已有答案:
我正在尝试在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;
}
}
?>
如果有人可以提供帮助,那就太好了!
在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);
您必须将DB连接传递给USER构造函数。
抛出的错误非常清楚。你在构造函数中缺少一个参数,期望1得到0个参数。
因此,基本上在实例化类new ClassName()
时,构造函数参数放在括号中。
// v Arguments of the constructor goes here
$user = new USER( );
在您的情况下,您缺少类构造函数需要的参数($DB)
。