问题是你有类,然后你有数据库数据。创建对象时,如何设置对象属性以包含数据库中的数据?
我看到这样的东西,我想知道这是否真的是最好的方法。我确信这是一个相当普遍的问题,但我不知道如何处理它是最受欢迎的解决方案。
在此示例中,在创建对象时,您将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...
}
}
}
有人可以提供一些示例代码或伪代码来说明执行此操作的正确方法吗?
答案 0 :(得分:4)
这可能是一种可接受的作业方式。但建筑本身并非如此。
表示业务数据的类(示例中的用户)必须与数据库访问逻辑松散耦合。最后,充当用户的PHP类不应该知道数据来自数据库,文件或任何其他资源。接下来,您将能够在其他项目中重用您的用户php类,而无需更改任何内容!如果你有数据访问逻辑,你就会陷入困境。
结论:我建议阅读一些关于设计模式的资源(在你的情况下看看DAO模式);)提示:Head First系列中的一个非常容易访问和愉快。
答案 1 :(得分:2)
您可以通过循环关联数组的键/值对来创建一个自动执行此操作的函数。或者你可以考虑使用ORM library。
答案 2 :(得分:1)
是的,您可以通过让父类继承所有对象来实现半自动化。在加载时,它查询“显示来自[my tablename]的字段”并使用名称填充关联数组。如果传入了一个id,它会在该表中查找具有该id的有效对象,并将值分配给该数组。
附注:请勿将您的ID直接传递到您的查询中。参数化sql并围绕任何用户输入包装一个函数来清理它。
答案 3 :(得分:0)
如果是mysql,你可以这样做:
$obj = mysql_fetch_object($query);
PDO能够使用任意类作为获取的目标,但要注意它们在运行构造函数之前分配变量数据:
$pdo->query($stmt, PDO::FETCH_CLASS, "MyClass", array('foo'=>'bar'));
...其中final参数包含类构造函数的参数。