【问题标题】:Getting database values into objects将数据库值放入对象
【发布时间】:2012-12-25 05:35:07
【问题描述】:

问题是你有类,然后你有数据库数据。创建对象时如何设置对象属性以包含数据库中的数据?

我看到了类似的东西,我想知道这是否真的是最好的方法。我确信这是一个相当普遍的问题,但我不知道如何处理它的最流行的解决方案是什么。

在此示例中,当创建对象时,您将 id 作为参数传递,然后使用 id 对数据库运行查询,并将返回的值分配给对象属性。我没有太多的 PHP 经验,也没有看到这个用得太多。

这是实现此目的的可接受方式吗?有没有更好或更被接受的方式?

public function __construct($id = null){
    if($id != null){
        $sql = "SELECT *
        FROM users
        WHERE user_id = $id";

        $res = Db::returnRow($sql);

        // $res contains an associative array with database columns and values

        if($res){
            $this->user_id = $res['user_id'];
            $this->user_name = $res['user_name'];
            //and so on...
        }
    }
}

有人可以提供一些示例代码或伪代码来说明执行此操作的正确方法吗?

【问题讨论】:

    标签: php oop


    【解决方案1】:

    这可能是家庭作业的一种可接受的方式。但在建筑上却不是。

    代表业务数据的类(示例中的用户)必须与数据库访问逻辑松散耦合。最后,作为用户的 PHP 类不应该知道数据来自数据库、文件或任何其他资源。之后,您将能够在其他项目中重用您的用户 php 类,而无需对其进行任何更改!如果您在其中有数据访问逻辑,那么您将陷入困境。

    结论:我建议阅读一些有关设计模式的资源(在您的情况下,请查看 DAO 模式);)提示:Head First 系列中的一个非常易于访问和享受。

    【讨论】:

    • 我真的很喜欢你的回答。我知道这对于家庭作业或类似您所说的事情可能没问题,因为它有效,但我知道它设计得很糟糕,这就是我问这个问题的原因。我正在研究您建议的资源。
    • 还有其他设计模式可以实现这一点吗?
    【解决方案2】:

    您可以创建一个函数来自动执行此操作,方法是遍历关联数组的键/值对。或者你可以考虑使用ORM library。

    【讨论】:

      【解决方案3】:

      是的,您可以通过让所有对象都继承自父类来半自动化此操作。在加载时,它会查询“SHOW FIELDS FROM [my tablename]”并使用名称填充关联数组。如果传入了 id,它会在该表中查找具有该 id 的有效对象并将值分配给数组。

      旁注:不要像这样将您的 id 直接传递到您的查询中。将 sql 参数化并围绕任何用户输入包装一个函数以对其进行清理。

      【讨论】:

        【解决方案4】:

        如果是mysql,你可以这样做:

        $obj = mysql_fetch_object($query);
        

        PDO 能够使用任意类作为获取的目标,但要注意它们在运行构造函数之前分配变量数据:

        $pdo->query($stmt, PDO::FETCH_CLASS, "MyClass", array('foo'=>'bar'));
        

        ...最后一个参数包含类构造函数的参数。

        【讨论】:

          猜你喜欢
          • 2011-12-09
          • 2018-09-27
          • 1970-01-01
          • 2016-11-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多