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