如何从PHP代码中分离sql

Lar*_*bar 5 php sql class code-separation

我有一个课程可以帮助我处理用户.例如:

$user = new User("login","passw");
$name = $user->getName();
$surname = $user->getSurname();
$table = $user->showStats();
Run Code Online (Sandbox Code Playgroud)

所有这些方法都有SQL查询.有些操作只需要一个SQL查询,有些只需要一个以上.如果数据库结构发生变化 - 将很难更改所有查询(类很长).所以我想让SQL查询远离这个类.但是怎么做呢?

在阅读了这个问题之后,我就了解了存储过程.这是否意味着,现在一个动作只需要一个SQL查询(调用存储过程)?但是如何从php组织分离sql?我应该在数组中保留sql-queries吗?或者它应该是一个sql-queries类.如果是的话,如何组织这个课程(也许我应该学习什么样的模式)

Jus*_*ier 5

这是一个非常大的主题,但我有一些建议可以帮助您:

您应该研究对象关系映射,其中对象自动生成SQL查询.有关概述,请查看对象关系映射活动记录文章.这将使您的数据库代码保持最小,并使表结构发生变化时更容易.

但这里没有银弹.如果您的架构发生了更改,必须更改您的查询才能匹配.有些人喜欢通过将查询逻辑封装在数据库视图和存储过程中来处理这个问题.如果您保持一致,这也是一种很好的方法,但请记住,一旦开始编写存储过程,它们将严重依赖于您正在使用的特定数据库.使用它们没有任何问题,但它们会让您更难以将数据库转移到路上 - 通常不是问题,而是要记住的一个重要方面.

无论如何,无论你选择哪种方法,我都建议你将数据库逻辑存储在几个"模型"类中.看起来你已经在做类似的事了.基本思想是每个模型都封装了数据库特定区域的逻辑.传统上,每个模型都将映射到DB中的单个表 - 这就是Ruby on Rails活动记录类的工作方式.这是一个很好的策略,因为它将数据库逻辑分解为简单的"块".如果你将所有数据库查询逻辑保存在一个文件中,它很快就会失去控制并成为维护的噩梦 - 相信我,我一直在那里!

为了更好地理解"大局",我建议您花一些时间阅读Web模型 - 视图 - 控制器(MVC)架构.您还需要查看已建立的PHP MVC框架,例如CodeIgniter,Kohaha,CakePHP等.即使您不使用它 - 尽管我建议您这样做 - 看看这些框架如何组织您的代码会很有帮助.