我是新手。我试图解决这个问题一天并一路搜索,但我仍然无法解决。
显示的错误
注意:未定义的变量: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/你会找到所有的答案。