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

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

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函数中传递它?

另外,我在我的HTML所在的index.php中调用类数据库的对象。

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

}

请阅读:stackoverflow.com/help/how-to-ask,您应该设置代码格式并突出显示第55行

$query = INSERT INTO $table ($column_list) VALUES ($insert_values)变量不会插在单引号字符串内。 并且很可能$insert_values =":".$column_list;被覆盖。

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

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

如果要将选项保存到类的属性db中,则必须使用$this->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中。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值