Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用Zend的动态数据库连接_Php_Zend Framework_Zend Db - Fatal编程技术网

Php 使用Zend的动态数据库连接

Php 使用Zend的动态数据库连接,php,zend-framework,zend-db,Php,Zend Framework,Zend Db,我试图实现的结果是,让一个应用程序拥有一个数据库,其中包含存储系统上用户数据的最小表。当用户登录到应用程序时,该数据库将用于验证用户的登录详细信息。我希望能够在用户登录后,根据主数据库中存储的有关该用户的详细信息,动态连接到另一个数据库 基本上,我希望系统上的每个用户都有自己的数据库,登录后连接到该数据库,并且能够使用公共db模型类(因为每个用户的db将与其他用户的db具有相同的表) 这可能吗?如果是这样,我将如何实现动态数据库连接(比如在验证其登录详细信息的操作中) 任何帮助都将不胜感激。相信

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

基本上,我希望系统上的每个用户都有自己的数据库,登录后连接到该数据库,并且能够使用公共db模型类(因为每个用户的db将与其他用户的db具有相同的表)

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


任何帮助都将不胜感激。

相信这是可能的。实现实际上取决于比您给出的更具体的需求,但我可能会创建某种类型的
Db_管理器
类。它将所有的细节抽象出来,以保持动作的简短和清晰。。。然后,您可能只需要执行以下操作:

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());
   }
}

通过这种方式,您可以在manager类中处理使用哪个db的所有实际排序,并将其传播到您的模型中。如果出现这种情况,还可以为您提供一个简单的中心点,以便在一个请求周期内处理多个DB。

最简单的答案不是建立第二个连接,而是在确定给定用户需要的名称后更改默认模式

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

$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适配器或表类等运行的任何查询


但是
USE
语句仅在辅助数据库与主数据库位于同一数据库实例上且包含用户详细信息时才有效。此外,这还假设您不需要根据数据库重新验证用户,因为每个用户都有不同的数据库级别凭据。

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