Una App con conexion a varias bases de datos

660 views
Skip to first unread message

JHONY JAVIER BURBANO ROBLES

unread,
Sep 19, 2016, 4:19:07 PM9/19/16
to CakePHP en Español
No recuerdo si ya poste este tema.

Buena tarde
Tengo un aplicativo que en este momento funciona bien. Con su base de datos y app normal, el cual hay guardo los usuarios y sus empresas y las demás tablas.
Pero ahora mis jefes me piden lo siguiente. Quieren que cada empresa con su usuario entre al sistema y tenga su propia base de datos, esto para tener los datos separados, ya que las empresas son celosas con ellos.
Intente generando una base de datos que tenga solo las tablas de usuario, roles, usuarioreles. Y que iniciara sesión normal y después que supiera quien entro. Puse en los controladores un llamado de la base de datos con $this->NombreModel->useDbConfig = 'alternate'; y llamar la base de datos y eso se me volvió un sambumbe y no me cuadraban unas cosas después de tantos intentos.
Estoy pensando en otra idea para Solucionarlo. Quisiera saber si alguien me puede ayudar a ver si existe una manera de tener un app y que desde él me pueda conectar a varias base de datos dependiendo del usuario que se le designo a la empresa.
Espero me hayan entendido. Muchas gracias de antemano

Pablo Rojasen el grupo de google+ me recomienda que todas las tablas tengan el id de la empresa. osea que solo sea una base de datos. 

Marco Antonio Hernandez

unread,
Sep 21, 2016, 12:01:49 PM9/21/16
to CakePHP en Español
Que tal JHONY JAVIER BURBANO ROBLES,


Te comento que tengo un aplicativo que hace exactamente eso que quieres hacer,

1 .-  Una base de datos base, donde se tienen tablas principales y de configuración, como usuarios, grupos de usuarios , permisos, empresas, etc.
2 .-  Por cada empresa se crea un nuevo esquema con sus respectivas tablas de trabajo.

Que es lo que tienes que hacer:

1.- Guardar en alguna tabla la relación entre el usuario y a que esquema(empresa) le corresponde y que cuando este usuario inicie session el nombre de la base de datos la mantengas en session: ejemplo $_SESSION['database_company']="db_name";

2. Ahora bien en tu archivo de configuración database.php crea dos conexiones una para tu base de datos base.
       
        //Agregas la demás información de conexión
public $default = array(
                'database' => 'base_database',
);

public $dynamic_connection= array(
'database' => '',
);


3.- En ese mismo archivo, sobrescribe el constructor de la clase de la siguiente manera:

/**
* Overwrite the construct to allow to connect to different data bases
*
*/
public function __construct()
{
if(isset($_SESSION['database_company']) )
$this->dynamic_connection['database']=$_SESSION['database_company'];
}

Asegúrate de poner la información correcta como la estes manejando.


4.- En tus modelo donde requieres que apunten al esquema de la empresa especifica su fuente:


public $useDbConfig = 'dynamic_connection';



Con esto debes tener resuelto tu problema.......


Saludos si requieres de apoyo escríbeme.

JHONY JAVIER BURBANO ROBLES

unread,
Sep 21, 2016, 3:06:21 PM9/21/16
to cakep...@googlegroups.com
Buena Tarde

Primero agradecerte por el aporte.
él variabde sesion para la base datos la hice asi. $this->Session->write("squema_bd", $user['Usuario']['conexion_bd']);  

tengo mi database.php

<? Php
DATABASE_CONFIG clase {
        
        /**
* Sobrescribir el constructo para permitir conectarse a diferentes bases de datos
*
*/
__construct función pública ()
{
if (isset ($ _SESSION [ 'squema_bd'])) {
                   $dato = $_SESSION ['squema_bd'];
                   $ This-> dynamic_connection = $ Dato;
                }
}

        $ Público, por defecto = array (
"Fuente de datos '=>' Base de datos / MySQL ',
'Persistente' => false,
'Anfitrión' => 'localhost',
'Entrar' => 'gccree5_innova',
'password' => 'vDlMT[#tqu*e',
'Base de datos' => 'gccree5_principal',
'Prefijo' => '',
// 'Codificación' => 'utf8',
);

        public $conexionbd01 = array(
"Fuente de datos '=>' Base de datos / MySQL ',
'Persistente' => false,
'Anfitrión' => 'localhost',
'Entrar' => 'gccree5_innova',
'password' => 'vDlMT[#tqu*e',
'Base de datos' => 'gccree5_integra01',
'Prefijo' => '',
// 'Codificación' => 'utf8',
);
.........

el constructor esta bien ?
luego hago en el model esto: public $useDbConfig  = 'dynamic_connection'; y me muestra el siguiente error



Que podría ser?

gacias por tu ayuda

Jhony Javier Burbano Robles
Analista y Desarrollador de Sistemas
Cel: 318 887 43 40
! Si alguien pregunta quien soy Yo, diles que soy el líder de mi vida. Gracias!!

--
Has recibido este mensaje porque estás suscrito a un tema del grupo "CakePHP en Español" de Grupos de Google.
Para anular la suscripción a este tema, visita https://groups.google.com/d/topic/cakephp-esp/QFxbz_0QH9M/unsubscribe.
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a cakephp-esp+unsubscribe@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a cakep...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/cakephp-esp.
Para acceder a más opciones, visita https://groups.google.com/d/optout.




Declinación de Responsabilidades: Los servicios de MISENA son soportados tecnológicamente por © Google y ofrecidos por el Servicio Nacional de Aprendizaje – SENA de manera gratuita a los aprendices e instructores de programas de formación titulada, las opiniones que contenga este mensaje son exclusivas de su autor y no representan la opinión del Servicio Nacional de Aprendizaje o de sus autoridades. El receptor deberá verificar posibles virus informáticos que tenga el correo o cualquier anexo, razón por la cual el SENA no es responsable de los daños causados por cualquier virus transmitido en este correo electrónico.

Los contenidos, textos, imágenes, archivos enviados en este mensaje son responsabilidad exclusiva del remitente y no reflejan ni comprometen de ninguna manera a la institución. No se autoriza el uso de esta herramienta para el intercambio de correos masivos, cadenas o spam, ni de mensajes ofensivos, de carácter político, sexual o religioso, con fines de lucro, con propósitos delictivos o cualquier otro mensaje que se considere indebido o que vaya en contra de la Ley.

JHONY JAVIER BURBANO ROBLES

unread,
Sep 21, 2016, 3:47:07 PM9/21/16
to cakep...@googlegroups.com
Marco ya pude hacerlo estaba tomando algunos datos mal. pero quiero saber si estaría bien. aunque hago el debug y si aparece la base de datos.
por ahora lo deje manual.

__construct función pública ()
{

if (isset ($ _ SESSION [ 'squema_bd'])) {
                   $dato = $_SESSION['squema_bd'];
                   $this->conexion_bd01['database'] = 'gccree5_integra01';
                }
debug($this->conexion_bd01['database']);
}

        $ Público, por defecto = array (
"Fuente de datos '=>' Base de datos / MySQL ',
'Persistente' => false,
'Anfitrión' => 'localhost',
'Entrar' => 'gccree5_innova',
'password' => 'vDlMT[#tqu*e',
'Base de datos' => 'gccree5_principal',
'Prefijo' => '',
// 'Codificación' => 'utf8',
);

        public $conexion_bd01 = array(
"Fuente de datos '=>' Base de datos / MySQL ',
'Persistente' => false,
'Anfitrión' => 'localhost',
'Entrar' => 'gccree5_innova',
'password' => 'vDlMT[#tqu*e',
'Base de datos' => array ( 'gccree5_integra01', 'gccree5_integra'),
'Prefijo' => '',
// 'Codificación' => 'utf8',
);

en el public de $conexion_bd01 yo utilice un array en el atributo Base de datos (database) y hay nombraría las bases de datos que tendría para cada una de las empresas.

Quiero saber si así esta bien hecho ?.

Muchas gracias

Marco Antonio Hernandez

unread,
Sep 21, 2016, 4:04:51 PM9/21/16
to cakep...@googlegroups.com
Pueden ser varias cosas:


1.- Verifica  que el nombre de la fuente de datos que indicaste en el modelo este correcto el nombre:

2.- verifica que el nombre de la base de datos que recuperas de la session realmente sea el esperado y que ese esquema lo tengas con ese nombre.


Me cuentas como te fue

--
Has recibido este mensaje porque estás suscrito a un tema del grupo "CakePHP en Español" de Grupos de Google.
Para anular la suscripción a este tema, visita https://groups.google.com/d/topic/cakephp-esp/QFxbz_0QH9M/unsubscribe.
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a cakephp-esp+unsubscribe@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a cakep...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/cakephp-esp.
Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
Marco Antonio Hernández Pérez
Lic. en Informática
Desarrollador de Software

--  Contacto ---
Skype: totem_mk
Mail: hepm860904hsprrr04
Cel: 8110495098

Marco Antonio Hernandez

unread,
Sep 21, 2016, 4:08:31 PM9/21/16
to cakep...@googlegroups.com
No he probado si pasandole un array funciona lo ultimo que supe en la version 2 .4 es que se le pasaba un string con el nombre de la base de datos y es por eso que se recupera desde la session.

Se cualquier manera puedes setearle una por default y al momento de usarse hará el cambio.

Saludos

El 21 de septiembre de 2016, 14:47, JHONY JAVIER BURBANO ROBLES <jjbur...@misena.edu.co> escribió:
--
Has recibido este mensaje porque estás suscrito a un tema del grupo "CakePHP en Español" de Grupos de Google.
Para anular la suscripción a este tema, visita https://groups.google.com/d/topic/cakephp-esp/QFxbz_0QH9M/unsubscribe.
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a cakephp-esp+unsubscribe@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a cakep...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/cakephp-esp.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

JHONY JAVIER BURBANO ROBLES

unread,
Sep 21, 2016, 4:23:10 PM9/21/16
to cakep...@googlegroups.com
No se si hice bien la pregunta. 

la pregunta es si se puede nombrar en el parametro database un array con todas las bases de datos que se tengan ??

 public $conexion_bd01 = array(
"Fuente de datos '=>' Base de datos / MySQL ',
'Persistente' => false,
'Anfitrión' => 'localhost',
'Entrar' => 'gccree5_innova',
'password' => 'vDlMT[#tqu*e',
'Base de datos' => array ( 'gccree5_integra01', 'gccree5_integra'),
'Prefijo' => '',
// 'Codificación' => 'utf8',
);

yo lo hice asi y le hago el debug en el contructor

        __construct función pública ()
{

if (isset ($ _ SESSION [ 'squema_bd'])) {
                   $dato = $_SESSION['squema_bd'];
                   $this->conexion_bd01['database'] = 'gccree5_integra01';
                }
debug($this->conexion_bd01['database']);
}

y me trae la base de datos que le coloque donde esta de color azul oscuro, ya luego con la session quedaría dinámica.

Muchas gracias por tu ayuda

Marco Antonio Hernandez

unread,
Sep 21, 2016, 4:27:16 PM9/21/16
to cakep...@googlegroups.com
Hola

Eso no se puede hacer, y en segunda en la session estas sobrescribiendo el valor.

Saludos

--
Has recibido este mensaje porque estás suscrito a un tema del grupo "CakePHP en Español" de Grupos de Google.
Para anular la suscripción a este tema, visita https://groups.google.com/d/topic/cakephp-esp/QFxbz_0QH9M/unsubscribe.
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a cakephp-esp+unsubscribe@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a cakep...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/cakephp-esp.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

JHONY JAVIER BURBANO ROBLES

unread,
Sep 21, 2016, 5:28:50 PM9/21/16
to CakePHP en Español
Bueno Marco Antonio Hernandez te comento como lo tengo y hasta me funciona bien.

1. Por ahora tengo mi tabla usuarios que tiene un campo llamado conexion_bd donde tiene el nombre de la base de datos (integra).
2. cuando inicio sesion creo la variable de sesion llamada name_bd:  $this->Session->write("name_bd", $user['Usuario']['conexion_bd']);
3. luego en mi archivo de configuración database.php tengo lo sigueinte: En el default esta la base de datos principal que es la que tiene los usaurios y tengo dos squemas $dynamic_connection y $dynamic_connection01 ambos con diferentes base de datos. 
  • ahora si hago lo que me explicasque y inicio sesion con el usuario que tiene el nombre de la base de datos (integra) osea squema $dynamic_connection si me conecta bien.
  • pero si hago lo mismo con otro usurio que tiene el nombre de la base de datos (integra01) osea $dynamic_connection01 no hace nada.
en el modelo coloco: public $useDbConfig  = 'dynamic_connection'; asi logicamente no me va dejar entrar al otro esquema.

Entonces como hago para que entre a otros esquemas dependiento del usuario q inicie sesion.

<?php
class DATABASE_CONFIG {
        
        /**
* Sobrescribir el constructo para permitir conectarse a diferentes bases de datos
*
*/
public function __construct()
{

if (isset($_SESSION['name_bd'])) {
                   $this->dynamic_connection['database'] = $_SESSION['name_bd'];
                }
}

        public $default = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'localhost',
'login' => '',
'password' => '',
'database' => 'gccree5_principal',
'prefix' => '',
//'encoding' => 'utf8',
);

        public $dynamic_connection = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'localhost',
'login' => '',
'password' => '',
'database' => 'integra',
'prefix' => '',
//'encoding' => 'utf8',
);

        public $dynamic_connection01 = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'localhost',
'login' => '',
'password' => '',
'database' => 'integra01',
'prefix' => '',
//'encoding' => 'utf8',
);

        public $test = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'user',
'password' => 'password',
'database' => 'test_database_name',
);
        
}

No se si este errado en lo que quiero.

Muchas gracias
Reply all
Reply to author
Forward
0 new messages