Web应用程序:将SQL与代码完全分开

时间:2013-08-15 07:21:54

标签: php sql architecture

这是一个设计问题,我一直在思考这个问题。

我想在独立文件或内存位置内分离SQL查询(以便更快地访问)。

查询将按如下方式存储:

SELECT .... WHERE col = ?

当需要查询时,它将从其位置获取。

(不太可维护的)示例替代方案是:

$sql = "select ..... where col=". prevent_injection($val) ." and ....";

优点:

  • 查询的完全分离:Web开发人员和DBA可以专门针对他们的角色工作
  • 清洁查询

缺点:

  • 需要对每个人进行一些协调?意味着,无论如何在一个大团队中都是必要的
  • 在运行时获取SQL可能会减慢速度,但可以使用缓存

有关此方法的任何反馈意见?

2 个答案:

答案 0 :(得分:0)

您应该看一下MVC(模型视图控制器)架构模式。它将使您实现目标:数据,逻辑和表示的分离。

在MVC中,您的模型将处理所有与SQL相关的逻辑,因此其他两个层将永远不必处理查询。

看看实现MVC模式的PHP框架,它们将大大简化将此模式应用于您的项目。我个人最喜欢的是Laravel 4,但还有很多其他内容,例如FuelPHPCodeIgniterCakePHP等。

这些框架中的大多数还具有缓存机制作为奖励,并且他们能够利用其他方法来加速您的Web应用程序:例如Redis和Memcache。

答案 1 :(得分:0)

通常我使用两种方法来阻止SQL注入。

ORM像propel一样,它本身处理所有SQL注入问题。您无需关心细节。一些MVC框架正在使用ORM。

PHP数据对象(又名:PDO)扩展。您可以编写如下代码。它还处理所有SQL注入问题

    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
    $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
    $stmt->bindParam(':name', $name);
    $stmt->bindParam(':value', $value);
    $stmt->execute();

根据您想要的好处,我建议您可以使用PDO来清除SQL并保持其轻量级。