Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将sql与php代码分离_Php_Sql_Class_Code Separation - Fatal编程技术网

如何将sql与php代码分离

如何将sql与php代码分离,php,sql,class,code-separation,Php,Sql,Class,Code Separation,我有一个类可以帮助我处理用户。 例如: $user = new User("login","passw"); $name = $user->getName(); $surname = $user->getSurname(); $table = $user->showStats(); 所有这些方法内部都有SQL查询。有些操作只需要一个sql查询,有些操作需要一个以上的sql查询。如果数据库结构发生更改,则很难更改所有查询(类很长)。所以我想让SQL查询远离这个类。但如何做到这一

我有一个类可以帮助我处理用户。 例如:

$user = new User("login","passw");
$name = $user->getName();
$surname = $user->getSurname();
$table = $user->showStats();
所有这些方法内部都有SQL查询。有些操作只需要一个sql查询,有些操作需要一个以上的sql查询。如果数据库结构发生更改,则很难更改所有查询(类很长)。所以我想让SQL查询远离这个类。但如何做到这一点呢


阅读之后,我了解了存储过程。这是否意味着,现在一个操作只需要一个SQL查询(存储过程调用)?但是如何组织sql和php的分离呢?我应该在数组中保留sql查询吗?或者它应该是一个sql查询类。如果是,如何组织此类课程(可能是我应该学习的模式)

如果您使用将业务逻辑与数据访问逻辑分离的方法,您将处于一个更好的位置。

我想说,您应该研究在代码中实现“存储库”设计模式

对于如何实现这一点,一个很好的答案对于本文来说太长了,因此我将发布几个面向PHP的参考:


这是一个令人惊讶的大话题,但我有一些建议可以帮助您:

您应该了解对象关系映射,在该映射中,对象自动生成SQL查询。请查看和文章以获取概述。这将使您的数据库代码保持最少,并使表结构更改时变得更容易

但这里没有银弹。如果模式发生更改,则必须更改查询以匹配。有些人喜欢通过将查询逻辑封装在数据库视图和存储过程中来处理这一问题。如果您是一致的,这也是一种很好的方法,但请记住,一旦开始编写存储过程,它们将与您正在使用的特定数据库紧密关联。使用它们并没有什么错,但它们将使您在以后切换数据库变得更加困难—通常不是一个问题,而是需要记住的一个重要方面

无论如何,无论您选择什么方法,我建议您将数据库逻辑存储在几个“模型”类中。看起来你已经在做类似的事情了。基本思想是每个模型封装数据库特定区域的逻辑。传统上,每个模型都会映射到数据库中的一个表——RubyonRails活动记录类就是这样工作的。这是一个很好的策略,因为它将数据库逻辑分解为简单的小“块”。如果将所有数据库查询逻辑都保存在一个文件中,它可能会很快失控,成为维护的噩梦——相信我,我已经做到了

为了更好地理解“全局”,我建议您花一些时间阅读web模型-视图-控制器(MVC)体系结构。您还需要查看已建立的PHP MVC框架,如、等。即使您不使用这些框架(尽管我建议您使用),查看这些框架如何组织您的代码也会很有帮助。

根据您的“已经有2K行代码”语句判断,您要么在维护一些东西,或者在开发某个东西的过程中

Faust和Justin Ethier都提出了很好的建议——“如何将数据库访问与应用程序代码分离”是web开发中最古老、回答最多的问题之一

就我个人而言,我喜欢MVC——它几乎是web开发的默认范例,它平衡了可维护性和生产力,并且在您进行开发时有大量的框架支持您

当然,您可能会认为从头开始重新编写应用程序太费劲了——在这种情况下,存储库模式是一个很好的折衷方案

不管是哪种方式,你都需要仔细阅读重构——从你现在的位置到你想要的位置都是一件棘手的事情。我推荐福勒写的那本书作为开始


你能解释一下为什么你的数据库模式会改变吗?这通常是前面有麻烦的迹象……

如果数据库模式发生更改,您将被迫更改将此模式映射到PHP的代码。没有神奇的灰尘能自动做到这一点。在这种情况下,存储过程不会改变任何东西,因为您将问题转移到必须编辑存储过程上。@Jon:分离是如何发生的。我的意思是,改变不会在一瞬间发生,但如果你必须检查每一个PHP文件,那可能是详尽的。@Jon,我理解这一点。但是如果我在PHP代码中有sql查询,大约有2k行代码(但sql查询大约有100行),那么您将滚动代码,可能会错过一些sql查询。但是,如果您的文件(类或数组)只包含sql序列,那么更改它们就更容易了。如果代码结构良好,您就不会真正遇到这样的问题。如果每个方法只执行不同的硬编码SQL,那么您肯定会遇到问题。有没有关于研究如何使用PHP和MySQL实现这一点的参考资料?我有PHP和html的分离,但是PHP和SQL呢?如果您将所有数据访问代码分离为一组数据访问类,那么@inuendo(以便它们与业务逻辑代码分离)然后,您的业务类可以调用它们来创建、读取、更新或删除数据。与所有好的模式一样,这适用于任何高级语言。我喜欢使用存储过程,但无论您是使用存储过程还是数据访问类中嵌入的参数化sql,更重要的出发点是保持sql访问分离e、 @Gunner关注点分离不是一个特定于语言的概念-它适用于所有高级语言。但这是IBM在php中采取关注点分离-这是我的第一个大项目。有编写的php代码(来自前程序员)-这是可怕的代码(html+php+sql在一些文件中)。我扔掉了这段代码,编写了新的html标记和php代码(里面没有html)