我有一个基于纯PHP的系统,现在我尝试将代码转换为Yii2。但我在这几个步骤中遇到了一个问题,我为每个用户都有一个数据库,当用户在我的系统中注册时,我会为它创建一个新的数据库,还有一个系统的主数据库。例如,我的数据库列表:
-
mainDb
-
客户1
-
客户2
-
客户3
-
客户4
-
客户5
所以我不知道应该有多少数据库,在我当前的代码中,我定义了两个函数,例如:在MainDB上运行SQL在客户数据库上运行SQL在上面的每个函数中,我都设置了连接字符串,但如何用Yii2处理这个问题?
提前感谢您的帮助。
我想找到一个解决方案,帮助我处理基于数据库名称的连接字符串。
默认情况下,Yii 2支持多个数据库,这些数据库可以添加到各自的数据库配置文件中。但这不适用于您的用例,因为您将动态生成数据库。
您可以使用特定的集合模式为每个客户命名数据库。比如:db_customer_1,db_customer.2,。。。。,db_customer_100等
在这里,前缀"db_customer_"将被固定,然后添加客户ID。
在Yii 2中,您可以执行以下操作:
Yii::$app->get('db_customer_' . CUSTOMER_ID);
CUSTOMER_ID可以在会话中使用。
不需要额外的表格。简单快捷。
您可以创建一个单独的表来执行此操作。
假设您在mainDb.php.等其他文件中有一个主数据库连接字符串
对于前
-
让我们在mainDb数据库中创建一个新表作为customer_databases。以hostname、dbname、dbusername、dbpassword、customer_id等列为例。
-
在customer_databases表中引用customer_id作为customer_id
-
登录时,从mainDb获取客户的详细信息,并根据客户id进行连接。
-
仅此而已,您必须根据客户id 进行连接
注意-为了不进行一次又一次的连接,您可以在会话变量中设置连接,然后从db.php文件返回连接字符串。
参考-
<?php
session_start((;
if(isset($_SESSION["user_database"](({
$connection = $_SESSION["user_database"];
$connection = json_decode($connection, true);
$hostname = ($connection['hostname']) ? $connection['hostname'] : "localhost";
$dbname = ($connection['dbname']) ? $connection['dbname'] : "dbname";
$username = ($connection['username']) ? $connection['username'] : "username";
$password = ($connection['password']) ? $connection['password'] : "password";
return [
'class' => 'yiidbConnection',
'dsn' => 'mysql:host=' . $hostname . ';dbname=' . $dbname,
'username' => $username,
'password' => $password,
'charset' => 'utf8mb4',
];
}其他{
return [
'class' => 'yiidbConnection',
'dsn' => 'mysql:host=localhost;dbname=dbname',
'username' => 'username',
'password' => 'password',
'charset' => 'utf8'
];
}
另外,不要忘记在注销时破坏连接。
快乐编码谢谢Mukul Kashyap