未捕获的错误:使用$ this

时间:2017-11-02 09:42:27

标签: php sql

我已经看过其他关于此的帖子,但我无法理解它们,这里有什么解决方案,你们能告诉我吗?请。静态还是非静态?这是什么意思?这是问题吗?

Db连接代码: -

<?php 
define('DB_SERVER', 'localhost'); 
define('DB_USERNAME', 'root'); 
define('DB_PASSWORD', ''); 
define('DB_DATABASE', 'not telling'); 
class DB_con { 
    public $connection; 
    function __construct(){ 
        $this->connection = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD,DB_DATABASE); 
        if ($this->connection->connect_error) 
            die('Database error -> ' . $this->connection->connect_error); 
    } 
    function ret_obj(){ 
        return $this->connection; 
    } 
}

获取记录的代码: -

<?php

$role_id = (isset($_SESSION['role_id']) ? $_SESSION['role_id'] : 4) ;

$query = "
   SELECT rights_codename FROM permissions 
   INNER JOIN roles_and_permissions ON fk_permissions_id = permissions_id
   WHERE fk_role_id = $role_id
   ";

$_SESSION['permissions'] = array();
$result = $this->db->query($query);
while($row = $result->fetch_assoc()){

   array_push($_SESSION['permissions'], $row['permissions_cname']);

 //  $_SESSION['permissions'][] = $row['permissions_cname'];

}
if(in_array('admin_rediger_bruger',$_SESSION['permissions'])){
}

?>
  

致命错误:未捕获错误:在C:\ xampp \ htdocs \ R_L_E \ login.php中不在对象上下文中时使用$ this:30堆栈跟踪:#0 {main}在C:\ xampp \ htdocs \ R_L_E中引发第30行\ login.php

2 个答案:

答案 0 :(得分:1)

在非专业人士术语中,$this是指在类中引用非静态函数的时候。您可以做的是创建数据库类的新实例,然后使用在实例化期间创建的变量来访问该类的成员函数

这样做

$conn = new DB_con();//instantiate the class.add this at the very top of login.php
$conn->connection->query('your sql stuff');//replace the $this->db->query($query) with this line 

您可以访问connection属性,因为它在您的班级中被声明为公开

另请不要忘记包含DB_con file

答案 1 :(得分:0)

$this是一个变量,当您在该对象中运行代码时,它引用“当前对象” 。这意味着,当你写这个:

class AClass {
    public function foo() {
        var_dump($this);
    }
}
$my_object = new AClass;
$my_object->foo();

然后$this在执行$my_object函数期间与foo()相同。您可以将其视为函数的额外参数,一旦您离开该函数,它将不再存在。

所以当你这样写:

$result = $this->db->query($query);

您需要在某个特定对象上调用的方法内部,以便有一个$this引用的对象。如果您使用全局代码,或者不属于类的函数或静态方法,则不存在“当前对象”,因此$this不存在。

在您的情况下,您正试图访问数据库连接对象的某个实例。这意味着您需要在代码中的某个位置创建该对象,并将其分配给变量,然后您可以引用该变量。您可以随意调用该变量,但不能将其称为$this,因为这是一个保留名称。

您的DB_Con类没有query()方法,所以看起来您想首先获取MySQLi对象,然后调用该方法。

所以你会写一些类似的东西:

 $my_db_connection = new DB_Con;
 $mysqli_connection = $my_db_connection->connection;
 // or: $mysqli_connection = $my_db_connection->ret_obj();
 $result = $mysqli_connection->query($query);

或者更简洁:

 $my_db_connection = new DB_Con;
 $result = $my_db_connection->connection->query($query);
 // or: $result = $my_db_connection->ret_obj()->query($query);