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