【问题标题】:How to inspect every query going to DB from Zend Framework如何检查从 Zend Framework 到 DB 的每个查询
【发布时间】:2011-07-29 16:56:23
【问题描述】:

我有一个复杂的报告应用程序,允许客户登录并查看其客户数据的报告。应用程序的几个部分使用各种控制器进行数据库调用。我需要确保客户端 A 不会通过标头操作获取客户端 B 的信息。

系统进行身份验证,并为其分配一个 clientID 和 roleID。如果您的 roleID >1,则表示您为托管数据的公司工作,您可以查看所有客户信息。我想创建一个基本上像这样工作的包罗万象:

    if($roleID > 1) {

    ...send query to database

   }else {
     if(...does this query select a record with clientID other than my $auth->clientID){
     do not execute query
  }else {
   execute query
   }
}

问题是,我希望对发送到服务器的每个查询都运行它...如何将此代码作为应用程序和数据库之间的“障碍”?我已经使用 Zend_Profiler 来查看查询,所以我知道这是有可能的,但无法从 Profiler 代码中辨别出来......

我总是可以编写一个身份验证函数并以这种方式传递选定的查询,但是这种包罗万象的方法会更容易在所有调用中实现,并且会成为未来的证明。任何帮助表示赞赏。

【问题讨论】:

  • 我倾向于使用 ZFdebug 工具栏,它非常有用 [数据库:SQL 查询的完整列表和每个查询的时间]jokke.dk/software/zfdebug

标签: zend-framework zend-db zend-db-select zend-db-profiler


【解决方案1】:

这是应用程序设计错误。 你应该使用“服务架构”——查询的唯一入口点是service。以及里面的任何检查。

【讨论】:

  • 不确定我是否理解...我认为 Zend Framework 是在充当伪服务?
【解决方案2】:

如果这是您希望在每个 查询上运行的内容,我建议扩展Zend_Db_Select 并覆盖query()assemble() 函数以添加到您的逻辑中。您还需要添加一种方法,让它知道您的 $auth 对象。

【讨论】:

    【解决方案3】:

    另一种选择是扩展您的数据库适配器,以便您可以直接拦截查询。 IMO,您应该尝试在应用程序级别执行此操作。

    【讨论】:

      【解决方案4】:

      根据您的数据库服务器,您可以在 DB 端放置跟踪。

      以下是 Oracle 的示例:

      http://orafaq.com/wiki/SQL_Trace

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-15
        • 1970-01-01
        • 2013-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多