Php 如何在数据层管理SQL语句

Php 如何在数据层管理SQL语句,php,sql,Php,Sql,在PHP项目中,我们已经将业务逻辑与数据库访问分离。所有数据库任务都封装在按数据库和主题分组的不同数据库类中。 这些类看起来非常可怕,一半的源代码是SQL字符串,其中填充了参数等等。我们考虑将SQL放在其他位置,比如资源文件之类的地方。这方面的最佳实践是什么?您知道PHP的任何支持工具/库吗 问候 Stephan好吧,您可以始终在不同的数据库中使用一致的API并编写 另一种选择是使用数据库抽象层,例如。您应该尽可能使用存储过程。这样可以提高性能、安全性和代码维护。这应该是你的第一个方法 如果仍要

在PHP项目中,我们已经将业务逻辑与数据库访问分离。所有数据库任务都封装在按数据库和主题分组的不同数据库类中。 这些类看起来非常可怕,一半的源代码是SQL字符串,其中填充了参数等等。我们考虑将SQL放在其他位置,比如资源文件之类的地方。这方面的最佳实践是什么?您知道PHP的任何支持工具/库吗

问候


Stephan

好吧,您可以始终在不同的数据库中使用一致的API并编写


另一种选择是使用数据库抽象层,例如。

您应该尽可能使用存储过程。这样可以提高性能、安全性和代码维护。这应该是你的第一个方法

如果仍要将SP查询与DAL分开,为什么不将它们存储在数据库中?将SQL查询存储在数据库中进行抽象似乎有些奇怪,因为提取其他查询需要一个查询。这实际上是一种非常常见的方法,您可以选择符合特定条件的查询,如果需要,还可以动态地构建查询

另一种方法是创建查询类,其中查询是动态建立的

class FruitQuery {
    ...
    public function addTypeCriteria($type) {
        $this->internalSQLCriterias[]  = "fruit=:type";
        $this->internalSQLParameters[] = array(':type', $type);
    }
    ...
    public function create() {
        $this->internalSQLQuery = "SELECT ... FROM Fruits";

        if (sizeof($this->internalSQLCriterias) > 0) {
            $this->internalSQLQuery .= " WHERE ";
            $moreThanOne = '';

            foreach ($this->internalSQLCriterias as $criteria) {
                $this->internalSQLQuery .= $moreThanOne . $criteria;
                $moreThanOne = " AND ";
            }
        }
    }
    ...
    public function execute() {
        /* Bind the parameters to the internalSQLQuery, execute and return results (if any) */
    }
...

这门课在任何方面都是绝对不完整的,你可能想重新思考它的结构——但你可能明白我想说的要点:当然,您必须过滤查询生成器的输入,以避免安全漏洞

数据库访问层中几乎不应该有任何SQL,因为它应该只是抽象与数据库的通信,而不管它实际在通信什么SQL

在现在著名的MVC模式中,您的业务逻辑通常包含形成模型层的SQL

抛开所有这些宗教定义不谈,现在的情况还算正常,最终会出现成堆的SQL。SQL必须存在于某个地方。根据您的优先级和性能要求,以下是我将按性能折衷顺序执行的操作:

如果SQL中有明显的重复,我会加入一个快速的重构迭代,以隐藏方法中所有常见的SQL。这些方法不一定要执行它,而只是构建它。这完全取决于您的应用程序以及SQL的复杂程度。如果您没有与数据库进行实际通信的底层,那么重构的一部分可能是添加它

<>我会考虑一个查询生成器。这是性能和灵活性之间的一个很好的平衡。您只能在ORM或数据库访问层(如Zend_Db及其子组件Prope和/或Doctrine)中找到查询生成器。因此,您可以将其中一个查询生成器移植到您的项目中,而无需使用整个层,这其实并不难,因为它们都是基于PDO的。这不应该增加任何明显的性能问题

我会考虑这个学说。但这对性能有相当大的影响。然而,最终您将得到非常可维护的代码


<>最后,我从来没有考虑把SQL放入资源或类似的东西。

< P>我不知道PHP,但是从我的经验,我可以告诉你这么多:数据访问层是一个主要的目标。有太多的最佳实践,没有一个是真正的最佳实践。在设计DAL时,很容易陷入过度抽象的陷阱。你想走多远就走多远

我几乎总是使用存储过程,以避免意大利面代码和简化数据库中的授权,而不是出于性能原因;由于数据库引擎准备存储过程的时间和方式的复杂性,很难确定存储过程带来的性能提升。另一方面,如果我需要编写一个非常灵活的数据库操作,比如在一个有很多输入的搜索屏幕上,我有时会在代码中添加SQL。有时候,不管你把它放在哪里,它都会是一个看不懂的烂摊子。你必须在某个地方做这项工作


如果您没有不必要地混合使用SQL和过程代码,请将SQL放在对应用程序的范围和规模最有意义的地方。很抱歉,我无法回答您关于PHP工具和libs的问题,但我希望这会有所帮助。

我们已经使用了PDO,我缺少的是,在项目中,哪里是存储SQL语句的最佳位置。目前,它们只是在数据库类的函数中定义的字符串。我正在附议存储的过程和视图。您还可以通过执行一组严格的操作来消除许多潜在的安全问题。