我真的很困惑从类内部与数据库接口的正确方法是什么,我知道我在下面做错了,但我仍然希望它至少可以工作?
class User{
public function user_email($user_id){
require_once("config/db.php");
$finduser = $db->query("SELECT email FROM `user` WHERE user_id = '".$user_id."' ");
$user_data = $finduser->fetch_assoc();
return $user_data["email"];
}
}
然后我使用下面的代码在另一个页面上显示结果,第一个实例工作正常,但第二个实例抛出错误。
<?php echo $user->user_email($user_id); ?>
<?php echo $user->user_email($user_id); ?>
Notice: Undefined variable: db on line 89
Fatal error: Call to a member function query() on a non-object on line 89
所以我基本上要问的是,从与数据库的连接在一个位置的类连接到数据库的好方法是什么?
感谢您的帮助!
对于数据库连接,我建议将数据库访问与类分开。您的 User 类应该只处理用户身份,它不应该知道它的数据来自哪里。
我建议为不同的职责使用不同的类。
例如
存储 库
应该处理从数据库中检索完整对象。它们将从数据库中返回一个(或仅一个)对象的集合,并使用数据库中的持久数据填充其信息。
实体或模型
应该只处理业务逻辑。这意味着,您不必调用数据库来获取用户的电子邮件,而是从数据库加载整个用户对象数据,然后将其设置在此处显示的 User 对象上。我这样做的方法(不使用像 Doctrine 或 Propel 这样的 ORM 或 MVC 框架附带的任何其他 ORM)是在你的对象上创建一个名为"setByArray"的函数,它将采用一个键控数组,该数组将根据你从数据库中找到的结果设置对象上的所有数据。
所以实际上,你的数据库访问应该从你的实际类中抽象出来。在类中使用数据库违反了 SOLID OOP 原则的单一责任原则。您的 User 类应该只关心成为用户。而不是如何访问它的数据。
编辑
对不起,我错过了你试图让它"正常工作"。你确定你的"config/db.php"实际上是一个路径,里面有一个名为$db的变量吗?您确定$db实际上是具有查询功能的对象吗?从我所看到的,$db不是一个对象。
看看@leneya在他/她的答案中有什么,这几乎是要走的路。
但是,如果您不只是将其作为学习努力,我鼓励您使用Doctrine2 ORM。
现在谈谈您的具体问题...
您应该将连接注入到类中。最简单的形式是:
class User {
protected $conn;
public function __construct(mysqli $conn) {
$this->conn = $conn;
}
public function getConnection() {
return $this->conn;
}
public function user_email($user_id){
$finduser = $this->getConnection()->query("SELECT email FROM `user` WHERE user_id = '".$user_id."' ");
$user_data = $finduser->fetch_assoc();
return $user_data["email"];
}
}
然后用法如下所示:
require 'connection.php';
$user = new User($db);
$email = $user->user_email($userid);
我还会更改connection.php
以返回 mysqli 对象,这样您就不会在单独的文件中声明 var:
// connection.php
// vars and stuff for the connection
// and then we return the instance
return new Mysqli($host, $user, $pass, $dbname);
现在当你使用它时,你可以做
$db = require('connection.php');
$user = new User($db);
$email = $user->user_email($userid);
话虽如此,这是一个非常奇怪的设计。通常,您将使用 getter 来访问完整用户对象的属性,并对特定内容运行查询。