gpt4 book ai didi

php - 可捕获的错误 - 参数必须是 PDO 的实例

转载 作者:行者123 更新时间:2023-11-29 12:51:00 24 4
gpt4 key购买 nike

大家好,我收到此错误:

Catchable fatal error: Argument 1 passed to Users::__construct() must be an instance of PDO, none given, called in C:\xampp\htdocs\xampp\ooplogin\register.php on line 46 and defined in C:\xampp\htdocs\xampp\ooplogin\class\Users.php on line 9

要说真正的代码工作没有问题,但你知道如果我想制作干净的代码,那里应该有任何错误。

我的代码:

<?php 
class Users {
/* Deklarovanie premennych */
public $name = null;
public $email = null;
public $phone = null;
public $message = null;

public function __construct(PDO $db_con)
{
$this->db_con = $db_con;
}

public function storeFormValues( $data )
{
if( isset( $data['name'] ) ) $this->name = stripslashes( strip_tags( $data['name'] ) );
if( isset( $data['email'] ) ) $this->email = stripslashes( strip_tags( $data['email'] ) );
if( isset( $data['phone'] ) ) $this->phone = stripslashes( strip_tags( $data['phone'] ) );
if( isset( $data['message'] ) ) $this->message = stripslashes( strip_tags( $data['message'] ) );
return $this;
}

public function message()
{
$correct = false;
try {
$sql = "INSERT INTO user(name, email, phone, message) VALUES (:name, :email, :phone, :message)";

$stmt = $this->db_con->prepare( $sql );
$stmt->bindValue( "name", $this->name, PDO::PARAM_STR );
$stmt->bindValue( "email", $this->email, PDO::PARAM_STR );
$stmt->bindValue( "phone", $this->phone, PDO::PARAM_STR );
$stmt->bindValue( "message", $this->message, PDO::PARAM_STR );
$stmt->execute();
return 'Sprava bola uspesne odoslana!';
}catch( PDOException $e ) {
return $e->getMessage();
}
}

public function displayAll()
{
try{
$sql = "SELECT * FROM users LIMIT 10";
$stmt = $this->db_con->prepare($sql);
$stmt->execute();
return $this->$stmt;
}catch( PDOException $e ) {
return $e->getMessage();
}
}
}

try {
$db_con = new PDO( DB_HOST, DB_USER, DB_PASS );
$db_con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$db_con->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}catch( PDOException $e ) {
return $e->getMessage();
}


$Users = new Users($db_con);
$Users->storeFormValues( $_POST );

echo $Users->message();
?>

我的 Index.php 看起来像:

<?php if( !(isset( $_POST['send'] ) ) ) { ?>

HTML FORM HERE

<?php
} else {
$Users = new Users;
$Users->storeFormValues( $_POST );
if( $Users->message() ) {
echo "Sprava bola úspešne odoslana";
} else {
echo "Sprava nebola odoslana";
}
}

?>

有人可以帮助我修复它或解释为什么它不起作用吗?谢谢!

最佳答案

您没有像错误消息所述那样传递 PDO 实例。

$Users = new Users;

编辑:首先,不要复制/粘贴代码并期望它能够工作。我会告诉你该怎么做,但不会给你任何代码。

当您创建一个在其构造函数中带有参数(没有默认值)的类时,您必须传递参数才能使其工作。这就是您收到此错误的原因。我向您展示的行是抛出错误的地方。 Users 类需要一个 PDO 对象,但您没有传递任何内容。尽管您在类文件中做到了这一点:

$Users = new Users($db_con);

当然,您还需要像在类文件中那样初始化 $db_con 变量。

这将解决您的问题。我还有一些建议。

  1. 将每个类放入单独的文件中,并且不要在这些文件中执行类之外的任何代码。
  2. 将您的连接($db_conn 初始化)放在一个单独的文件中,以便您可以在任何需要的地方再次调用它。
  3. 请参阅 includerequire 函数,了解如何从其他文件获取代码以应用 1 和 2。

这些是非常基本的建议。有更复杂但更好的方法来做同样的事情,比如自动加载和 IoC 容器。但是,当开始编码时,为了保持理智,您可以将这些概念留到以后再学习。 :)

关于php - 可捕获的错误 - 参数必须是 PDO 的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24723007/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com