Php 如何使用动态数据库登录?
我正在制作关于laravel 5.7的项目。在这里,我必须使用动态数据库管理登录。其中一个主数据库和另一个是子数据库。 因此,当用户提供登录详细信息时,如果在主数据库上找不到登录名,则首先检查主数据库,然后在App\u clients表上查看master\u db上的电子邮件,并找到该电子邮件id的数据库名称并检查登录名。如果登录成功,则移动到仪表板。每次登录子数据库(客户端2)之前,数据库都将激活 这个概念的主要目标是有两种不同的登录方式。 1) 仅限软件所有者登录主数据库。 2) 另一个登录是针对正在使用此软件的客户端的 因此,当客户端登录时,他们的数据库名称将使用他们的电子邮件从App\u client表中显示出来。因此Laravel数据库配置将更改并设置新数据库供其使用,并且数据库将处于活动状态,直到客户端登录,否则默认数据库将处于活动状态 比如说 数据库::Php 如何使用动态数据库登录?,php,laravel-5,eloquent,Php,Laravel 5,Eloquent,我正在制作关于laravel 5.7的项目。在这里,我必须使用动态数据库管理登录。其中一个主数据库和另一个是子数据库。 因此,当用户提供登录详细信息时,如果在主数据库上找不到登录名,则首先检查主数据库,然后在App\u clients表上查看master\u db上的电子邮件,并找到该电子邮件id的数据库名称并检查登录名。如果登录成功,则移动到仪表板。每次登录子数据库(客户端2)之前,数据库都将激活 这个概念的主要目标是有两种不同的登录方式。 1) 仅限软件所有者登录主数据库。 2) 另一个登录
主数据库、客户端数据库、客户端数据库等。
电邮:abc@ex.com密码:1234存储在Client_2_db中
首先,它将检查Master_db。它将失败。然后它的电子邮件将在Master\u db.App\u客户端上查看,并将获得存储在Master\u db.App\u客户端上的数据库名称。
因此,在这之后,将尝试从客户端登录
为此,我在myLoginController上使用了这段代码
if( $request->client == '1111111' )
{
Config::set('database.default', 'mysql');
DB::reconnect('mysql');
$loginCheck= Auth::attempt( ["email" =>$request->username , "password" => $request->password ] );
if( $loginCheck )
{
// Store Collage ID on session variable.
$client = SettingClient::where('client_CODE',$request->client_code)->first();
$request->session()->put('client', $client->ID );
$request->session()->put('cclient_code', $client->client_CODE );
$request->session()->put('client_name', $client->client_NAME );
$request->session()->put('database_name', 'col_master' );
return redirect('dashboard');
}
goto InvalidLoginFound;
}
elseif ( $request-> client_code != '1111111' )
{
$clientCheck = AppClient::where("client_code" , $request->client_code )->orderBy('id','desc')->first();
if( !$clientCheck )
{
goto clientCodeNotFound ;
}
DB::purge('mysql');
Config::set("database.connections.mysql", [
"driver" => "mysql",
"host" => env('DB_HOST'),
"database" => $clientCheck->database_name,
"username" => env('DB_USERNAME'),
"password" => env('DB_PASSWORD'),
"engine"=>"InnoDB",
]);
Config::set('database.default', 'mysql');
DB::reconnect('mysql');
$loginCheck= Auth::attempt( ["email" =>$request->username , "password" => $request->password ] );
if( $loginCheck )
{
// Store client ID on session variable.
$client = SettingClient::where('client_CODE',$request->client_code)->first();
if( !$client )
{
goto clientCodeNotFound;
}
$request->session()->put('client', $client->ID );
$request->session()->put('login_id', $request->username );
$request->session()->put('password', $request->password );
$request->session()->put('client_code', $client->client_CODE );
$request->session()->put('client_name', $client->client_NAME );
$request->session()->put('database_name', $clientCheck->database_name );
return redirect('dashboard');
}
$request->session()->flush();
Auth::logout();
goto InvalidLoginFound;
}
还为此创建了一个中间件,用于根据每个请求管理数据库
class DynamicDatabaseMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if( session()->get('login_id') )
{
DB::purge('mysql');
Config::set("database.connections.mysql", [
"driver" => "mysql",
"host" => '127.0.0.1',
"database" => session()->get('database_name')?session()->get('database_name'):'',
"username" => 'root',
"password" => '',
"engine"=>"InnoDB",
]);
// Config::set('database.default', 'mysql');
DB::reconnect('mysql');
}
return $next($request);
}
}
关于Karnel.php
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\SessionDataMiddleware::class,
\App\Http\Middleware\StoreExceptionMiddleware::class,
\App\Http\Middleware\DynamicDatabaseMiddleware::class,
],
在这之后,这是可行的,但问题是当我尝试在Auth::user()中检查登录时,我总是从Master\u db(col\u Master)表单中从客户端\u db获取登录详细信息。
为什么?我不知道。请更正此代码。您的路径正确。只是还没到
您需要在中间件中添加整个登录请求,并且对于要检查的每个数据库连接,都要设置一个开关或try/catch(使用->continue)或者使用if/elseif语句转到您拥有的evry数据库连接,如果在其中一个数据库连接中找到该用户,则它将连接该用户并转到下一个请求。如果没有,则它将显示错误。请注意,在语句(数据库连接开关)中,您需要清除连接并再次连接到新的数据库用户名/密码。你可以用(
)
祝你好运我搜索了很多,尝试了很多解决方案,但在我的时代没有任何解决方案。
现在我回答了我的问题
我只是做了一个函数,在.ENV文件中搜索DB_名称,然后替换它。
当我的客户机登录数据库找到后,它将旧的数据库名称替换为新的on.ENV。
再次登录后,在注销时替换默认数据库名称
protected function updateEnv($key, $newValue, $separator='')
{
$path = base_path('.env');
// get old value from current env
$oldValue = env($key);
// was there any change?
if ($oldValue === $newValue) {
return;
}
// rewrite file content with changed data
if (file_exists($path)) {
// replace current value with new value
return file_put_contents(
$path, str_replace(
$key.'='.$separator.$oldValue.$separator,
$key.'='.$separator.$newValue.$separator,
file_get_contents($path)
)
);
}
}
//用于登录
$this->updateEnv('DB_DATABASE',$appClient->db_name,'');
但仍然是个问题。它第一次返回null,然后再次刷新,工作正常。。为什么?我不知道
此解决方案不适用于多个来自不同位置的登录 使用此方法连接多个db的Gaurav ji,因为您不了解我的要求。请阅读我的问题…我的子数据库的数据库名称来自主数据库,当客户端想要登录时,每次记录都会来自App_客户端表…我已经更新了我的问题。所以请检查并回复。你能和我分享一下你的电子邮件号码吗pankajwork017@gmail.com. 我将与你分享真实的代码。请帮帮我,我没有时间,gupta ji如果你能加入我的anydex,那么我可以演示我的问题..先生,现在我面临Auth::user()的问题。当我尝试在另一个api上使用Auth::user()时,它就不起作用了。。并从Master_DB users表中给出记录。假设客户端数据库是client_2,那么在登录Auth::user()之后应该从客户端数据库返回结果,但从主数据库返回数据。当不同的api调用时,它会从主数据库->用户表中获取数据。然后,您需要检查模型中的连接,并使其也是动态的,以便根据登录名随数据库的更改而更改。使数据库crud操作的模型。假设你有4个数据库,1个主数据库和3个从数据库,或者backeup之类的。但所有4个表位都相同,但数据却不同。您需要在模型中添加连接名称,这样就可以开始了。受保护的$connection='mysql';protected$table='模型正在使用的选项卡名称ex:users';我可以这样做吗?$connection=Session->get('connection')如果您使用的是api登录,那么这是不好的。如果您同时有两个或多个登录,那么您的应用程序将崩溃,因为您正在为用户更改相同的连接。
$this->updateEnv('DB_DATABASE',$appClient->db_name,'');