PHP OOP 对类内数据库的调用


PHP OOP call to database inside a class

我真的很困惑从类内部与数据库接口的正确方法是什么,我知道我在下面做错了,但我仍然希望它至少可以工作?

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 来访问完整用户对象的属性,并对特定内容运行查询。