如何解决oop错误

时间:2016-06-02 15:59:26

标签: php oop mysqli

我是新手。我试着解决这个问题并且一直在搜索,但我仍然无法解决。

出现错误

  

注意:未定义的变量: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: %s\n", mysqli_connect_error());
            exit();
        }
    }   
}

dbFunction

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;     
    }  
}

4 个答案:

答案 0 :(得分:0)

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

function __construct() {  
    parent::__construct();

    // additional dbFunction construction here
} 

答案 1 :(得分:0)

首先,您的$db__construct()方法中的局部变量,而不是类属性,其次,正如@wogsland指出的那样,它会被孩子覆盖。
您可能想要查看一下the OO basics

dbConnect.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: %s\n", mysqli_connect_error());
            exit();
        }
    }   
}

dbFunction

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

编辑:

我的帖子是你问题的准确答案,但正如其他人在评论中指出的那样,你需要改进很多东西,我希望这段代码适合你自己的个人游戏而不是“生产”。

因此,与代码示例直接相关,您可能希望扩展两个显而易见的事项:

答案 2 :(得分:0)

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

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

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

return $db;

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

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

答案 3 :(得分:0)

首先要学习一些OO编程的基础知识,看起来你应该在以任何方式使用它们之前首先阅读它们。试试这个http://litove.com/object-oriented-programming-2/你会得到所有答案。