如何解决OOP错误



我是新手。我试图解决这个问题一天并一路搜索,但我仍然无法解决。

显示的错误

注意:未定义的变量:db(在 dbFunction 中)

致命错误:在非对象上调用成员函数 query()(在 dbFunction 中)

和代码是

dbConnect.php

class dbConnect{
    
    public $db;
    
    public function __construct(){
        $db = new mysqli("localhost", "root", "", "onlineshopping");
        $db->set_charset("charset");
        if (mysqli_connect_errno()) {
            printf("Connect failed: %sn", mysqli_connect_error());
            exit();
        }
    }   
}

数据库函数

class dbFunction extends dbConnect {  
    
    function __construct() {  
               
    }  
    
    public $db;
    
    public function UserRegister($fname, $lname, $tel, $email, $pass){
        $pass = md5($pass);  
        $db->query("INSERT INTO member(fname, lname, tel, email, password) values('".$fname."','".$lname."','".$tel."','".$email."','".$pass."')") or die(mysqli_error());  
        return $db;     
    }  
}
首先

,您的$db__construct() 方法中的局部变量,而不是类属性,其次,正如@wogsland所指出的,它被子级覆盖。
您可能需要复习一下 OO 基础知识

数据库连接.php

class dbConnect{
    public $db;
    public function __construct(){
        $this->db = new mysqli("localhost", "root", "", "onlineshopping");
        $this->db->set_charset("charset");
        if (mysqli_connect_errno()) {
            printf("Connect failed: %sn", mysqli_connect_error());
            exit();
        }
    }   
}

数据库函数

class dbFunction extends dbConnect {  
    public function UserRegister($fname, $lname, $tel, $email, $pass){
        $pass = md5($pass);  
        $this->db->query("INSERT INTO member(fname, lname, tel, email, password) values('".$fname."','".$lname."','".$tel."','".$email."','".$pass."')") or die(mysqli_error());       
    }  
}

请注意,在这两种方法中,$db都替换为$this->db

编辑:

我的帖子是你问题的确切答案,但正如其他人在评论中指出的那样,你需要改进很多东西,我希望这段代码是供你个人玩的,而不是用于"生产"的东西。

因此,与代码示例直接相关的是,您可能想要扩展两个明显的事情:

  • 至少转义所有输入以避免SQL注入
  • 不要使用 MD5 对密码进行哈希处理,因为它非常弱,请检查更安全的密码哈希方法

您的dbFunction类重新定义了__construct()而不执行任何操作,因此$db属性保持未定义状态。如果您不想更改 dbFunction 中的构造函数,只需省略它,就会使用父构造函数。另一方面,如果要添加到构造函数的功能中,请确保调用父构造函数:

function __construct() {  
    parent::__construct();
    // additional dbFunction construction here
} 

首先,没有必要让 dbFunction 成为 dbConnect 的子类。它们根本没有关系。事实上,我根本找不到任何使dbConnect成为一个类的必要。您所需要的只是模块 __construct()。我建议您阅读OOP概念:)

不过,回答你的问题 - dbConnect 中的 __construct() 函数应该返回 db 变量!您可以在 dbFunction 中将此返回值分配给 db 变量。

将以下行添加到 dbConnect 的 __construct() 的 if 子句之外:

return $db;

然后在 dbFunction 中实例化类 dbConnect 的一个对象,并将 db 分配给该返回值。(我假设dbFunction现在不是dbConnect的子级...

dbConn = new dbConnect()
db = dbConn.__construct()

首先学习一些OO编程的基础知识,似乎在以任何方式使用对象和实例之前,您应该首先阅读它们。试试这个 http://litove.com/object-oriented-programming-2/你会找到所有的答案。

最新更新