出于某种原因,我收到了这个错误:
致命错误:在第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);
}
答案 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);