由于某种原因,我收到此错误:
致命错误:在第 55 行的 C:''wamp''www''www''Project_6''Quiz''database.class.php 中的非对象上调用成员函数 prepare()
这可能是因为$db变量不是 PDO 的对象,尽管它是。它与它在__construct
方法中的事实有什么关系吗?还是我需要在插入查询函数中传递它?
此外,我在索引中调用我的类数据库的一个对象.php,我的 HTML 也位于该对象。在索引中.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(){
}
}
这是我的索引。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);
}
您不会将数据库句柄保存在公共变量中。你在这里使用$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
.
将新对象分配给变量$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);