如何将SQL与PHP分离?

4

根据《代码整洁之道》中的建议,我希望我的PHP代码中没有SQL。目前,我正在使用预处理语句,并将数据库访问代码分解为模型类。

我的初步想法是将SQL拆分到单独的SQL文件中,然后在运行时加载它们。由于这涉及更多的磁盘IO(我的直觉),我想知道是否有其他方法。

另外,我想知道是否有人尝试过这种方法,以及它是否有所回报。

谢谢。


“在运行时加载它们”是什么意思? - Joe Phillips
我的意思是在执行之前,它们需要从磁盘中获取。而不是内联在 PHP 代码中。 - Allain Lalonde
3个回答

8

如果您只是想分离SQL,为什么不使用存储过程呢?


3
那是一个非常ASP.NET风格的回答。 - cletus
3
这句话的意思是:无论这个解决方案是否属于ASP.NET,它都能解决问题。可以翻译为:“是否基于ASP.NET并不重要,关键是它能解决问题。” - madcolor
3
好的,我想我需要澄清一下:我使用“ASP.NET'ish”并不是作为一个积极的形容词。 :) - cletus
1
我正在使用Mysql,但我还没有完全确信实现方式。无论如何,对于好的解决方案加1。 - Allain Lalonde

8
我对您的建议是不要犯许多人尝试将PHP转变成另一种东西的错误。
PHP是一种基于Web的模板语言,允许您在HTML页面中嵌入代码。它具有请求生命周期,而不是持久性(就像Java servlet一样)。它的API主要是过程式的。
这一切都不是问题。
然而,您会发现有些人坚持试图将C#或Java编程中所用到的对象模型、ORM和其他结构强制用于PHP,通常是错误的。
为了具体回答您的问题,我倾向于将所有查询(函数)放在一个文件中(如果有很多查询,则将它们分别按数据库或一些功能分离进行分离),并且SQL只是在函数中的heredocs中。不需要在代码中随处嵌入SQL逻辑非常有用。
您可以将SQL放在文本文件中,并使用file_get_contents()来读取它,但这有什么好处呢?
毫无意义地琢磨而试图将其他语言和框架的原则应用于PHP是没有意义的。使用PHP做它擅长的事情(或使用其他工具)。不论哪种方式,您都会更加快乐。

5
我认为你需要的是数据访问层。我没有读过《Clean Code》, 但我猜测 Uncle Bob 的意思是不要在各个地方都有一堆原始的 SQL 和数据库设置/访问代码。将数据库准备、执行等代码抽象出来,放入一个单独的模块中,然后从那里进行操作。
使用存储过程的建议也是我认同的好主意,虽然这是一个有争议的话题,在双方都有优点的情况下。我倾向于使用存储过程,但并非每个人或每种情况都适用。

我的数据访问层就是我的模型类,只是最终你会在同一个文件中混合使用PHP和SQL。在这本书中,他实际上指的是在一个文件中使用多种语言,比如英语、Java和SQL,这是三种不同的语言。 - Allain Lalonde
当PHP是呈现和操作数据的语言时,将SQL和PHP混合在一起不是很有意义吗?在我看来,问题不在于将SQL/SP与PHP代码混合在一起,而在于如何进行混合并最小化以使代码易读且易于维护。 - RC.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接