php - fatal error : Call to a member function prepare() on a non-object

标签 php mysql pdo

由于某种原因,我收到此错误:

Fatal error: Call to a member function prepare() on a non-object in C:\wamp\www\Project_6\Quiz\database.class.php on line 55

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

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

这是我的数据库类:

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

最佳答案

您没有将数据库句柄保存在公共(public)变量中。您在这里使用$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中。

关于php - fatal error : Call to a member function prepare() on a non-object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27964858/

相关文章:

PHP - 带 SQL 查询的嵌套 while 循环

PHPMailer 分别向数据库中的每个地址发送电子邮件

mysql - 排除相关记录 - 关联犯罪

php - 在 Woocommerce 中之前按 _sale_price_dates_to 获取产品 ID

php - 使用 PHP/SQL 循环的表中的按钮

java - 似乎无法让从我的 Android 应用程序发送的 http 获取参数显示在我的 PHP 页面上

php - 重复模式的概念如何运作

php - PDO查询结果包含 "PDO Object()"

php - 如果我确定我在动态语句中使用的某个值是整数,我是否可以避免 SQL 注入(inject)?

mysql - 每个 IP 地址每天仅在表中插入 10 次