Php 不同类中的冗余MySQL查询
我正在创建一个PHP Web应用程序,它使用8个类(后面还有更多)。我意识到所有这些类都具有几乎相同的访问数据库的功能:get_single、get_list、insert、update和delete 当然,对于每个类,哪个数据库表被寻址,哪个字段被选择是不同的 例如:Php 不同类中的冗余MySQL查询,php,mysql,redundancy,Php,Mysql,Redundancy,我正在创建一个PHP Web应用程序,它使用8个类(后面还有更多)。我意识到所有这些类都具有几乎相同的访问数据库的功能:get_single、get_list、insert、update和delete 当然,对于每个类,哪个数据库表被寻址,哪个字段被选择是不同的 例如: function get_single($conn) { $sql = $conn->prepare('SELECT id_person, join_date, img_profile, img_header,
function get_single($conn) {
$sql = $conn->prepare('SELECT id_person, join_date, img_profile, img_header, firstname, familyname, nationality, mail, password, birthday FROM person WHERE id_person = ?');
$sql->bind_param('i', $this->id);
$sql->execute();
$sql->bind_result($this->id, $this->join_date, $this->profile_img, $this->header_img, $this->firstname, $this->familyname, $this->nationality, $this->mail, $this->password, $this->birthday);
$sql->fetch();
return $this;
}
我问自己是否可以或应该为所有类编写一个函数,如下所示:
function get_single($id, $conn, $query) {
$sql = $conn->prepare($query);
$sql->bind_param('i', $id);
$sql->execute();
$sql->bind_result(/* ??? */);
$sql->fetch();
return /* ??? */ ;
}
。。。然后打电话
$foo = new Foo(array('id' => $bar));
$foo = get_single($foo->id, $conn, $qry_single_foo);
这样我可以
- 集中存储所有SQL查询
- 减少代码的总量
- 增加可读性。。。也许吧
谢谢您可以使用web MVC框架或ORM库 请检查一些可以与应用程序集成的ORM库 ORM
get_single()
-函数:$p->get_single($conn)
。在调用函数之前,$p
已经是所需类型的对象,但除了ID之外为空。函数只是填充了它。那么为什么要使用工厂来创建一个已经存在的对象呢?其次,我仍然不确定如何泛化bind\u result()
-函数,以便所有类都可以使用它?例如,某些类别(或数据库表)有“名字”,其他类别有“说明”或“文件名”,必须用结果填充…感谢到目前为止:)Factory模式和Repository模式是不同的模式,但主要一起使用..Factory模式不是关于如何使用“调用对象”,是关于如何“创建对象”。bind_result()函数是一个mysql方法。因此,您可以在数据库对象上使用它。存储库模式用于CRUD操作。问题是,存在“紧密耦合”,或者类是潜在的“上帝对象”“。您可能需要查看存储库设计模式。”。。嗯,我不完全确定我是否使用MVC。。。我有一些类,这些类完成了所有数据库与查询的连接。我有一个index.php,其中大部分业务逻辑都发生在那里,我在那里包含了不同的页面,这些页面完成了所有的显示工作(所有的HTML).你的方法有点正确..但主要问题是很难学会用php实现OOP,因为它最初是一种脚本语言..而且OOP是一个大世界..可能有其他一些设计模式等来解决你的问题,但你的问题涉及到存储库设计模式..这是最容易理解的模式之一..我有点困惑(我的代码有点错误)。我像这样调用get_single()
-函数:$p->get_single($conn)
。在调用函数之前,$p
已经是所需类型的对象,但除了ID之外为空。函数只是填充了它。那么为什么要使用工厂来创建一个已经存在的对象呢?其次,我仍然不确定如何泛化bind\u result()
-函数,以便所有类都可以使用它?例如,某些类别(或数据库表)有“名字”,其他类别有“说明”或“文件名”,必须用结果填充…感谢到目前为止:)Factory模式和Repository模式是不同的模式,但主要一起使用..Factory模式不是关于如何使用“调用对象”,是关于如何“创建对象”。bind_result()函数是一个mysql方法。因此,您可以在数据库对象上使用它。存储库模式用于CRUD操作。。