【问题标题】:Dynamic Database Connections with ZendZend 的动态数据库连接
【发布时间】:2010-10-12 04:52:34
【问题描述】:

我试图实现的结果涉及到一个应用程序的数据库具有最小的表,用于存储有关系统上用户的数据,该数据库将用于在用户登录应用程序时验证用户的登录详细信息。我希望能够在用户登录后根据主数据库中存储的有关该用户的详细信息动态连接到另一个数据库。

基本上,我希望系统上的每个用户都有自己的数据库,一旦他们登录就连接到该数据库,并且能够使用常见的数据库模型类(因为每个用户的数据库都与其他用户的数据库具有相同的表) .

这可能吗?如果是这样,我将如何实现动态数据库连接(假设在验证其登录详细信息的操作中)。

任何帮助将不胜感激。

【问题讨论】:

    标签: php zend-framework zend-db


    【解决方案1】:

    最简单的答案是不要进行第二次连接,而只是在确定给定用户需要的名称后更改默认架构。

    例如,获取给定用户的辅助数据库的名称:

    $db = Zend_Db::factory(...options...);
    $secondary_db = $db->query("SELECT secondary_db 
        FROM user_data WHERE user = ?", $userid)
       ->fetchOne();
    

    然后运行查询以更改架构。请注意USE 语句不支持准备语句,因此您必须使用驱动程序 API 执行它:

    $db->getConnection()->query("use $secondary_db");
    

    现在,如果您在未限定其架构的情况下引用表,您将在辅助数据库中获得该表实例。这包括您通过 Zend_Db 适配器或 Table 类等运行的任何查询。

    USE 语句仅在您的辅助数据库与具有用户详细信息的主数据库位于同一数据库实例上时才有效。而且这还假设您不需要针对数据库重新验证用户身份,因为每个用户都有不同的数据库级凭据。

    【讨论】:

    • 谢谢比尔,我有几个关于这个解决方案的问题(请耐心等待,我不是专家)。 1. 在我调用父类的构造函数之前,将我的 USE 查询放在扩展 Zend_Db_Table_Abstract 的抽象类的构造方法中,然后让我的所有模型都扩展抽象类,我会完全没问题吗?
    • 2.当您说“但是 USE 语句仅在您的辅助数据库与具有用户详细信息的主数据库位于同一数据库实例上时才有效”,您能否澄清一下,我不完全确定您的意思以及我是否会满足这一点健康)状况。再次感谢!
    • 他的意思是你必须使用相同的服务器实例/dsn ...例如,所有数据库都必须在mysql://localhost的mysql服务器上可用,而不是mysql://mysql.auth.localmysql://mysql.userbase.local
    • @prodigitalson:没错,但我使用术语“实例”是因为理论上您可以在一台物理服务器上运行多个 MySQL 实例(尽管这种情况并不常见)。
    • @machinemessiah:我不会将 USE 查询放在抽象表类中,我会在验证用户后立即执行。将信息(哪个用户)靠近操作(使用该用户的数据库)。
    【解决方案2】:

    当然可以。实现实际上将取决于比您给出的更具体的要求,但我可能会制作某种Db_Manager 类。抽象出所有细节以使动作简短明了……那么您可能只需执行以下操作:

    public function loginAction()
    {
       $request = $this->getRequest();
       $user = $request->getParam('username');
       $pass = $request->getParam('password');
    
       $auth = new My_Auth_Adapter($user, $pass);
       $authResult = Zend_Auth::getInstance()->authenticate($auth);
    
       if($authResult->isValid()){
          My_Db_Manager::connectForUser($authResult->getIdentity());
       }
    }
    

    通过这种方式,您可以处理要使用的数据库的所有实际排序,并将其传播到管理器类中的模型。如果出现这种情况,它还将为您提供一个简单的中心点来处理在一个请求周期中处理多个数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 2016-07-05
      • 2013-10-09
      • 1970-01-01
      相关资源
      最近更新 更多