Php 致命错误:对非对象调用成员函数prepare()
出于某种原因,我出现了以下错误: 致命错误:在C:\wamp\www\Project\u 6\quick\database.class.php的第55行对非对象调用成员函数prepare() 这可能是因为$db变量不是PDO的对象,尽管它是。它是否与它在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
\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代码>正在被覆盖。