Cakephp 3中的动态数据源和全局?
我有一个将被许多数据库使用的应用程序。要选择包含应用程序数据的数据库,我有一个包含连接参数(主机、用户名、密码、数据库…)的数据库 问题是,这个动态创建的数据源不适用于应用程序的其余部分 控制器代码Cakephp 3中的动态数据源和全局?,php,cakephp,controller,connection,cakephp-3.0,Php,Cakephp,Controller,Connection,Cakephp 3.0,我有一个将被许多数据库使用的应用程序。要选择包含应用程序数据的数据库,我有一个包含连接参数(主机、用户名、密码、数据库…)的数据库 问题是,这个动态创建的数据源不适用于应用程序的其余部分 控制器代码 $data = $this->request->data; $connection = ConnectionManager::get("default"); $query = "SELECT * FROM clients WHERE client_id = ".$d
$data = $this->request->data;
$connection = ConnectionManager::get("default");
$query = "SELECT * FROM clients WHERE client_id = ".$data['codigo'];
$result = $connection->execute($query)->fetchAll('assoc');
ConnectionManager::drop('default');
$config = ConnectionManager::config('connection', [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => $result[0]['host'],
'username' => $result[0]['username'],
'password' => $result[0]['password'],
'database' => $result[0]['database'],
'encoding' => 'utf8',
'timezone' => 'UTC',
'flags' => [],
'cacheMetadata' => true,
'log' => false,
'quoteIdentifiers' => false,
'url' => env('DATABASE_URL', null),
]);
$connection = ConnectionManager::get('connection');
ConnectionManager::alias('connection', 'default');
return $this->redirect(['controller' => 'Mains', 'action' => 'index']);
在这个重定向之后,显然其他控制器没有这个数据源。根据请求数据中的内容交换数据库肯定有点不寻常-但通常数据库连接只需要在Cake的初始设置中提前完成,由于每个控制器的连接资源已设置为默认值 如果只交换一次,可以在
config/bootstrap.php
(Cake通常将其设置为ConnectionManager)中进行管理
您将无权访问$this->request
,但可以从$\u request中获取它,例如:
在config/bootstrap.php
中,更改以下行:
Cache::config(Configure::consume('Cache'));
ConnectionManager::config(Configure::consume('Datasources'));
Email::configTransport(Configure::consume('EmailTransport'));
为此:
编辑:从原始SQL切换到表::find()哎哟,这就是SQL注入漏洞!永远不要在查询中直接插入用户数据!您继承了OPs SQL注入漏洞!我更改了代码,出现了这个错误:注意(8):未定义的索引:codigo[ROOT\config\bootstrap.php,第156行]。在进行配置之前,我需要通过表单获取这些数据。cakephp在my form.Ah之前读取bootstrap.php-当它第一次呈现该表单时,应该连接到哪个数据库?默认值?如果是这样,只需将所有内容包装在
ConnectionManager::config(Configure::consume('Datasources'))之后在一个大的if语句(if(!empty($_REQUEST['codigo']){
)中,直到那个电子邮件线路员,代码>都不起作用。我忘了删除到一个具有基本连接的数据库的直接连接
Cache::config(Configure::consume('Cache'));
ConnectionManager::config(Configure::consume('Datasources'));
$connection = ConnectionManager::get("default");
$client = TableRegistry::get('Clients')->find()
->where(['client_id'=> $_REQUEST['client_id']])->firstOrFail();
ConnectionManager::drop('default');
$config = ConnectionManager::config('connection', [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => $client->host,
'username' => $client->username,
'password' => $client->password,
'database' => $client->database,
'encoding' => 'utf8',
'timezone' => 'UTC',
'flags' => [],
'cacheMetadata' => true,
'log' => false,
'quoteIdentifiers' => false,
'url' => env('DATABASE_URL', null),
]);
ConnectionManager::get('connection');
Email::configTransport(Configure::consume('EmailTransport'));