我正在尝试实现的结果涉及使用具有最小表的数据库的应用程序来存储关于系统上用户的数据,该数据库将用于在登录到应用程序时验证用户的登录详细信息。我希望能够做的是根据在主数据库中存储的有关该用户的详细信息,在用户登录后动态连接到另一个数据库。
基本上我希望系统上的每个用户都有自己的数据库,一旦登录就连接到该数据库,并且能够使用通用的数据库模型类(因为每个用户的数据库将与每个其他用户的数据库具有相同的表)
这可能吗?如果是这样,我将如何实现动态数据库连接(假设在验证其登录详细信息的操作中)。
非常感谢任何帮助。
答案 0 :(得分:1)
当然可能。实现真的取决于比你给出的更具体的要求,但我可能会做一些Db_Manager
类。抽象出所有细节,以保持行动简短和seet ...那么你可能只是采取行动:
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());
}
}
通过这种方式,您可以处理要使用的db的所有实际排序,并将其传播到manager类中的模型。它还可以为您提供一个简单的中心点,以便在一个请求周期内处理多个DB。如果出现这种情况。
答案 1 :(得分: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
语句仅在辅助数据库与主数据库位于同一数据库实例上且具有用户详细信息时才有效。此外,假设您不需要针对数据库重新验证用户,因为每个用户都有不同的数据库级凭据。