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

时间:2015-01-15 13:46:43

标签: php mysql pdo

出于某种原因,我收到了这个错误:

  

致命错误:在第55行的C:\ wamp \ www \ Project_6 \ Quiz \ database.class.php中的非对象上调用成员函数prepare()

这可能是因为$ db变量不是PDO的对象,尽管它是。它与__construct方法中的事实有什么关系吗?或者我需要在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(){


    }



}

这是我的INDEX.PHP代码:

    //require_once omdat als file niet werkt of gevonden kan worden het script niet werkt
    require_once 'database.class.php';
    require_once 'user.class.php';

    $db = new Database();

    if(isset($_POST['reg_submit'])){

        $users_cols = array("username", "password");
        $post_values = array($_POST['regUsername'], $_POST['regPassword']);

        $db->insertQuery('users', $users_cols, $post_values);
    }

3 个答案:

答案 0 :(得分:1)

您不会将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

答案 1 :(得分:1)

在构造函数中,您将PDO类实例化为$db变量。但是,您尝试将其与$this->db一起使用。

将新对象分配给变量$ db时,可在构造函数中创建局部变量。构造函数完成后它会消失。

如果要将该选项保存到班级的db属性中,则必须改为使用$this->db

答案 2 :(得分:0)

在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);