Php 致命错误:对非对象调用成员函数prepare()

Php 致命错误:对非对象调用成员函数prepare(),php,mysql,pdo,Php,Mysql,Pdo,出于某种原因,我出现了以下错误: 致命错误:在C:\wamp\www\Project\u 6\quick\database.class.php的第55行对非对象调用成员函数prepare() 这可能是因为$db变量不是PDO的对象,尽管它是。它是否与它在\u构造方法中这一事实有关?或者我需要在insertquery函数中传递它吗 另外,我在index.php中调用类数据库的一个对象,我的HTML也位于其中。 在index.php中,我还调用Insertquery函数 这是我的DB类: class

出于某种原因,我出现了以下错误:

致命错误:在C:\wamp\www\Project\u 6\quick\database.class.php的第55行对非对象调用成员函数prepare()

这可能是因为$db变量不是PDO的对象,尽管它是。它是否与它在
\u构造
方法中这一事实有关?或者我需要在insertquery函数中传递它吗

另外,我在index.php中调用类数据库的一个对象,我的HTML也位于其中。 在index.php中,我还调用Insertquery函数

这是我的DB类:

class Database{

    //constantes zijn geen properties want die kan je niet veranderen
    const DB_HOSTNAME = "localhost";
    const DB_USERNAME = "root";
    const DB_PASSWORD = "";
    const DB_NAME = "quiz";
    private $typedb = "mysql";
    public $db;
    //protected $_sql;

    public function __construct(){

        //heeft geen conditie nodig. moet uitgevoerd worden dus try
        try
        {
            //object aanroepen van de class PDO (ingebouwd in PHP)
            $db = new PDO($this->typedb.':host='.self::DB_HOSTNAME.';dbname='.self::DB_NAME, self::DB_USERNAME, self::DB_PASSWORD);
            $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        //anders wat? heeft wel een conditie nodig, bij een exception van PDO dus, die store je in de $e
        catch(PDOException $e)
        {
            return $e->getMessage();
        }

    }



    //$values verwacht $_POST waardes dus is al array
    public function insertQuery($table, array $cols, array $values){


        //$insert in een for each loop
        $column_list = implode(",", $cols); //returns string: 'username, password'

        $post_params = implode(",", $values);
        $count = 0;

        //de PDO parameters maken, met een ':'voor de columnnaam
        foreach($cols as $insert_values){
            $count++;

            //doe dit voor het aantal kolommen
            if($count < $cols){

                $insert_values = ":".$column_list;

            }
        }
        $query = 'INSERT INTO $table ($column_list) VALUES ($insert_values)'; //"INSERT INTO users (username, password) VALUES(:username, :password)
        $insert = $this->db->prepare($query);
        //voor elke kolom een binding
        foreach($values as $post_params){
            $count++;
            if($count < $cols){

                $insert->bindParam($insert_values, $post_params);
            }
        }
        $insert->execute();


    }

    public function selectQuery(){

        // SELECT FROM WHERE ORDER BY

    }

    public function updateQuery(){


    }

    public function deleteQuery(){


    }



}

不在公共变量中保存db句柄。您在此处使用
$this db

$insert = $this->db->prepare($query);
但是在构造器中,没有将PDO连接保存在该变量中

$db = new PDO($this->typedb.':host='.self::DB_HOSTNAME.';dbname='.self::DB_NAME, self::DB_USERNAME, self::DB_PASSWORD);
这应该是:

$this->db = new PDO($this->typedb.':host='.self::DB_HOSTNAME.';dbname='.self::DB_NAME, self::DB_USERNAME, self::DB_PASSWORD);

否则连接不会保存在构造函数中的
$this->db

中,您可以将PDO类实例化到
$db
变量中。但是,您可以尝试将它与
$this->db
一起使用

$insert = $this->db->prepare($query);
将新对象分配给变量$db时,将在构造函数内创建一个局部变量。它将在构造函数完成后消失


如果要将选项保存到类的属性
db
,则必须改用
$this->db

在PHP类中,必须使用
$this->
设置变量,以使类中的其他方法可以访问这些变量

在构造函数中,您正在初始化数据库连接,如下所示:

$db = new PDO($this->typedb.':host='.self::DB_HOSTNAME.';dbname='.self::DB_NAME, self::DB_USERNAME, self::DB_PASSWORD);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
但是,$db变量仅在该方法完成运行之前存在。要使其在类的生命周期中生存,请通过
$this->
将其分配给类本身:

$this->db = new PDO($this->typedb.':host='.self::DB_HOSTNAME.';dbname='.self::DB_NAME, self::DB_USERNAME, self::DB_PASSWORD);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
现在,PDO对象是类的成员,可以通过引用相同的名称在其他地方访问:

$insert = $this->db->prepare($query);

请阅读:您应该格式化代码并突出显示第55行
$query='INSERT INTO$table($column_list)值($INSERT_VALUES)
变量不会插入单引号字符串中。最有可能的是
$insert_values=“:”$column_list正在被覆盖。