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

标签 php mysql pdo

大家好,我收到此错误:

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/

相关文章:

php - Magento 欧盟增值税税验证失败,未应用客户组更改

php - 函数错误中的 MySQL 调用过程

python - 我怎样才能不出现 mysql 转换元组错误?

MySQL 交易和双花

PHP MySQL 插入查询不工作,不显示任何错误消息

php - 不能为空 - PhP PDO 函数

mysql - 计算不为空的列数

javascript - Codeigniter ajax调用错误

mysql - 使用 3 个连接在一个查询中更新 2 个不同的表?

php - 如何使用 jquery 对话框按钮提交表单?