当前位置: 首页 > 知识库问答 >
问题:

PHP致命错误:未捕获错误:调用成员函数prepare()

宇文鸣
2023-03-14

这是三个文件

Database.php
Admin.php

我得到一个错误“Fatal error:Uncattle error:Call to a member function prepare()on null”。这段代码运行在我的localhost上没有问题,但是当它上传到服务器时,我就出现了这个问题。我在本地使用PHP8和xammp软件。我是三年级学生,请帮帮我。

文件database.php:

class Database{

private $dbhost = 'localhost';
private $dbname = 'pubg';
private $dbuser = 'root';
private $dbpass = '';
protected $connect;


public function __construct()
{
    $options = [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
    ];
    try {
        $this->connect = new PDO('mysql:host='.$this->dbhost.';dbname='.$this->dbname, $this->dbuser, $this->dbpass, $options);

    }catch (Exception $err){
        echo $err->getMessage();
    }

}

// select
public function select($sql, $value = [], $fetch = 'fetch')
{
    $result = $this->connect->prepare($sql);
    foreach ($value as $key => $item){
        $result->bindValue($key + 1, $item);
    }
    $result->execute();
    if($fetch == 'fetch'){
        $row = $result->fetch(PDO::FETCH_OBJ);
        return $row;
    }else{
        $row = $result->fetchAll(PDO::FETCH_OBJ);
        return $row;
    }
}

}

文件admin.php

require_once 'Database.php';
class Admin extends Database{
public function checkHasAdmin($chat_id)
{
    $sql = "SELECT * FROM table_admin WHERE chat_id = ?";
    return $this->select($sql,[$chat_id]);
}
public function Admin()
{
    $sql = "SELECT * FROM table_admin";
    return $this->select($sql,[]);
}}

共有2个答案

施德元
2023-03-14

在PHP<8中,赋予一个与类同名的方法被认为是构造函数(即使它已经被弃用很长时间并触发警告)。

因此,当您在PHP<8中实例化admin类时,它将调用admin::__construct,而该类不调用父构造函数(没有parent::__construct),因此它将尝试执行$this->select,而不初始化对象(及其$connect属性),因此会出现错误。

但是,在本地运行的PHP8中,这种构造函数已经被完全删除,因此它是一种普通的方法,在实例化admin对象时不会被调用。

这里有一个小演示展示了两者的区别。请注意,在PHP8中,什么都不会打印出来,而在以前的版本中,会出现“hello”。

解决方案:将admin方法重命名为其他方法。

上官淮晨
2023-03-14

$this->connect为空,因为您需要实例化您的类。

从不使用__construct()方法

像这样:

public function checkHasAdmin($chat_id)
{
    $db = new Database();
    $sql = "SELECT * FROM table_admin WHERE chat_id = ?";
    return $db->select($sql,[$chat_id]);
}
 类似资料: