Foros del Web » Programando para Internet » PHP »

conexion a dos bases de datos.

Estas en el tema de conexion a dos bases de datos. en el foro de PHP en Foros del Web. Hola a todos, estoy trabajando con dos base de datos a la vez y tengo un problema. He creado la clase para manejar mi base ...
  #1 (permalink)  
Antiguo 23/02/2010, 10:55
 
Fecha de Ingreso: octubre-2008
Mensajes: 140
Antigüedad: 15 años, 6 meses
Puntos: 1
conexion a dos bases de datos.

Hola a todos, estoy trabajando con dos base de datos a la vez y tengo un problema. He creado la clase para manejar mi base de datos:

Código PHP:
<?php
class MySQL {
    private 
$connection;

    public function 
__construct($host$user,$password,$database) {
        if(!isset(
$this->connection)) {
            
$this->connection = (mysql_connect($host,$user,$password)) or die(mysql_error());
            
mysql_select_db($database,$this->connection) or die(mysql_error());
        }
    }

    public function 
execute($sql) {
        
$result mysql_query($sql,$this->connection);
        if(!
$result) {echo 'MySQL Error: ' mysql_error();  exit;}
        else {return 
$result;}
    }

    public function 
get_table($table) {
        
$rows $this -> execute("SELECT * FROM " $table);
        while(
$row mysql_fetch_row($rows)) {$result[]=$row;}
        return 
$result;
    }

    public function 
get_results($sql) {
        
$rows $this -> execute($sql);
        while(
$row mysql_fetch_row($rows)) {$result[]=$row;}
        return 
$result;
    }

    public function 
num_rows($sql) {
        return 
mysql_num_rows($this -> execute($sql));
    }

}
Luego instancio dos objetos:

$db_o = new MySQL("localhost","root","","flp");
$db_d = new MySQL("localhost","root","","presta");

pero por ejemplo:

si ejecuto $db_o->get_results("SELECT id FROM user");

y luego ejecuto $db_d->get_results("SELECT id FROM client")

me dice que presta.client no existe osea que esta cogiendo el campo de la segunda consulta y lo quiere ejecutar con la primera conexion.

Alguien puede decirme como solucionar esto?

gracias!
  #2 (permalink)  
Antiguo 23/02/2010, 11:17
Avatar de jackson666  
Fecha de Ingreso: noviembre-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 1.971
Antigüedad: 14 años, 5 meses
Puntos: 65
Respuesta: conexion a dos bases de datos.

El problema es que se crea un unico link de conexion a la base y es asumido para cualquier otra instancia de la clase.
lo que deberias hacer es (si es que podes), hacer todas las consultas y demas con un objeto, y luego crear otro objeto y seleccionar otra base.
Sino tambien creo que mysql_connect() tiene un parametro opcional para forzar la creacion de un nuevo link.
Creo que es algo asi:

Código PHP:
Ver original
  1. mysql_connect($hos,$user,$pass,true);

El 'true' obliga a crear un nuevo link

Si te fijas en el manual, hay un ejemplo en el que se conecta a varias bases de datos.

Al margen:

Estas seguro que esto es lo que queres hacer?

Código PHP:
Ver original
  1. while($row = mysql_fetch_row($rows)) {$result[]=$row;}

Estarias devolviendo una matriz ahi, la estaras recorriendo bien??

Pensa, mysql_fetch_row() te devuelvo un array secuencial por resultado, y vos estas metiendo en cada posicion de $result ese array! Fijate si lo estas recorriendo bien despues...
__________________
HV Studio
Diseño y desarrollo web

Última edición por jackson666; 23/02/2010 a las 11:23
  #3 (permalink)  
Antiguo 23/02/2010, 11:21
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: conexion a dos bases de datos.

bueno yo creo que el problema puede estar por aka
Código PHP:
Ver original
  1. public function __construct($host, $user,$password,$database) {
  2.         if(!isset($this->connection)) {
  3.             $this->connection = (mysql_connect($host,$user,$password)) or die(mysql_error());
  4.             mysql_select_db($database,$this->connection) or die(mysql_error());
  5.         }
  6.     }

if(!isset($this->connection)) { <-- con eso le dices que si ya hay una coneccion no cree otra.. entonces al conectar a la primera base de datos ya no conectas la segunda..

quitale la condicional y prueba denuevo!

saludos
__________________
More about me...
~ @rhyudek1
~ Github
  #4 (permalink)  
Antiguo 23/02/2010, 11:29
Avatar de DeeR  
Fecha de Ingreso: diciembre-2003
Ubicación: Santiago
Mensajes: 520
Antigüedad: 20 años, 4 meses
Puntos: 17
Respuesta: conexion a dos bases de datos.

Puedes utilizar una capa de abstración de datos como PEAR:DB, que te permite trabajar con todos los motores de db que soporta PHP (debes tener el modulo activado).

Te dejo de un ejemplo de un script que utiliza mysql, sqlite y postgresql

Saludos.
  #5 (permalink)  
Antiguo 23/02/2010, 11:33
Avatar de jackson666  
Fecha de Ingreso: noviembre-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 1.971
Antigüedad: 14 años, 5 meses
Puntos: 65
Respuesta: conexion a dos bases de datos.

Cita:
Iniciado por DeeR Ver Mensaje
Puedes utilizar una capa de abstración de datos como PEAR:DB, que te permite trabajar con todos los motores de db que soporta PHP (debes tener el modulo activado).

Te dejo de un ejemplo de un script que utiliza mysql, sqlite y postgresql

Saludos.
Me parece que ese no es el problema de el. El no quiere conectarse a n-motores de bases de datos, lo que quiere hacer es trabajar en un mismo programa con dos bases distintas. No con 2 motores distintos.

Ademas esa clase lo que debe hacer (no se si miraste el ejemplo que pusiste) es tener un mysql_close() dentro del metodo magico __unset(), entonces al borrar el objeto con unset() se cierra la conexion, por eso es que puede crear otras...
__________________
HV Studio
Diseño y desarrollo web
  #6 (permalink)  
Antiguo 23/02/2010, 21:03
Avatar de DeeR  
Fecha de Ingreso: diciembre-2003
Ubicación: Santiago
Mensajes: 520
Antigüedad: 20 años, 4 meses
Puntos: 17
Respuesta: conexion a dos bases de datos.

Si, efectivamente el ejemplo utiliza tres motores de db, pero se puede cambiar para que utiliza un mismo motor (mysql) y dos db distintas (habria que tener dos instancias de pear:db una configurada para mysql y una db, mientras la otra mysql y otra db).

Saludos.
  #7 (permalink)  
Antiguo 23/02/2010, 22:18
Avatar de zerpico_01  
Fecha de Ingreso: enero-2008
Ubicación: Wilde - Avellaneda -
Mensajes: 421
Antigüedad: 16 años, 3 meses
Puntos: 13
Respuesta: conexion a dos bases de datos.

o yo soy mu vago o ustedes son unos genios....

yo trabajo con cinco bases de datos a la vez y no uso ni classe ni nada solo tomo los id y las variables a cada una las relaciono con las distintas bases...
simplemente uso if else, else if, y switch (case.....
dependiendo de cada case tomo una base, dependiendo de cada id tomo un if o else, asi voy creando una mareja de codigo que ni yo entiendo
pero rapido y funcional

saludos
  #8 (permalink)  
Antiguo 23/02/2010, 22:26
Avatar de jackson666  
Fecha de Ingreso: noviembre-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 1.971
Antigüedad: 14 años, 5 meses
Puntos: 65
Respuesta: conexion a dos bases de datos.

Cita:
Iniciado por zerpico_01 Ver Mensaje
o yo soy mu vago o ustedes son unos genios....

yo trabajo con cinco bases de datos a la vez y no uso ni classe ni nada solo tomo los id y las variables a cada una las relaciono con las distintas bases...
simplemente uso if else, else if, y switch (case.....
dependiendo de cada case tomo una base, dependiendo de cada id tomo un if o else, asi voy creando una mareja de codigo que ni yo entiendo
pero rapido y funcional

saludos
Me parece excelente. Postea tu codigo, ya que es la solucion al problema de hucht.

Al margen:
No entiendo para que usan mas de 1 base de datos...
__________________
HV Studio
Diseño y desarrollo web
  #9 (permalink)  
Antiguo 23/02/2010, 22:39
Avatar de zerpico_01  
Fecha de Ingreso: enero-2008
Ubicación: Wilde - Avellaneda -
Mensajes: 421
Antigüedad: 16 años, 3 meses
Puntos: 13
Respuesta: conexion a dos bases de datos.

pues poster mi codigo como dije es una mareja de codigo jajaja

pero es simple yo uso un administrador para gestionar mis cds, mis archivos, cosas que descargo, clientes, pagos etc....
cree una pagina index que carga un cinco ventanas en ajax, cada ventana
son consultas a las distintas bases de datos, ahora si realizo uno de los formularios de de una de las ventanas, ahi comienza funcionar los case, por ejemplo

una de las consultas

switch ($formulario1){
case "1";
llamo archivo de conexion independiente
break;
}

los datos los paso por GET y POST si paso una variable tipo GET verifico cual es
si es formularioA muesto todo el contenido que gestionara y procesera los datos del formulario1

ahora como veras trabajo con mas de una base de datos pero nunca con todas a la vez, siempre es una por vez...
para la carga del index uso un ajax que muestra un div haciendo rotaciones de distintos contenidos de la base de ese modo puedo mostrar las cinco a la vez...
ejemplo
Código:
var divid = "divibaseuno";
var url = "conecta1.php"; 


function cargaDIV(){

function refreshdiv(){



var xmlHttp;
try{
xmlHttp=new XMLHttpRequest(); 
}
catch (e){
try{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); 
}
catch (e){
try{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e){
alert("Tu explorador no soporta AJAX.");
return false;
}
}
}
......sigue con el calculo de tiempo a refrescar en segundo....
a mi me sirve .....

saludos

Última edición por zerpico_01; 23/02/2010 a las 22:45
  #10 (permalink)  
Antiguo 23/02/2010, 22:53
Avatar de jackson666  
Fecha de Ingreso: noviembre-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 1.971
Antigüedad: 14 años, 5 meses
Puntos: 65
Respuesta: conexion a dos bases de datos.

Cita:
Iniciado por zerpico_01 Ver Mensaje
ahora como veras trabajo con mas de una base de datos pero nunca con todas a la vez, siempre es una por vez...
Como veras, tu ejemplo no sirve... Si leyeras el post principal, te darias cuenta.
hucht requiere hacer mas de una instancia de la clase y en esas instancias, conectar a distintas bases. Claro es el ejemplo que pone:

Código PHP:
$db_o = new MySQL("localhost","root","","flp");
$db_d = new MySQL("localhost","root","","presta"); 
__________________
HV Studio
Diseño y desarrollo web
  #11 (permalink)  
Antiguo 23/02/2010, 23:33
Avatar de zerpico_01  
Fecha de Ingreso: enero-2008
Ubicación: Wilde - Avellaneda -
Mensajes: 421
Antigüedad: 16 años, 3 meses
Puntos: 13
Respuesta: conexion a dos bases de datos.

perdon yo solo hice un comentario jackson666 de que tal vez hay una forma mas sencilla de hacerlo, tu me diste hilo....

si lees lo que he escrito veras que a buen entendedor pocas palabras...

si va conectar con varias instancias lo unico que necesita es un

switch ($conexionuno){
case "1";
conxion1
break;
case "2";
coxiondos
break;
}

y por otra parte necesita un codigo generalizado que no importe que tabla o registro precise si no que tome variables como dije antes yo uso IF , ELSE .....

mira aqui un ejemplo generalizado de consulta mysql:

Código PHP:
    function sqlselcionatablas($tabla,$ordenacion){
        
$sql "SELECT * FROM ".$tabla." ORDER BY ".$ordenacion."";
        
$resultados = @$this->coneccionUno($sql);
        return 
$result;
    }


en mis archivos solo uso para distintas tablas esto :
if(
conexion1){
$clientes=CLIENTES_ID;
$nombre=nombre_clientes
sqlselcionatablas
($clientes,$nombre); 
}
else{
otros datoss
}
y asi sigo con cada tabla y base de datos.... 
pero simpre uso una funcion generalizada, no tengo ni idea si tiene algun nombre este tipo de consulta yo la llamo asi

para inserccion uso esto :

Código:
	function sqlInsertardatos($tabla,$datos,$campos){
		$into = "";
		$value = "";
		$vas = "";
		for($I = 0; $I < sizeof($dados); $I++){
			$into  .= $vas.$campos[$I];
			$value .= $vas."'".$datos[$I]."'";
			$vas = ",";
		}
		$insert = "INSERT INTO ".$tabla."(".$into.") 
               values (".$value.")";
		$this->conecta($insert);
	}
pero seguramente como lo estan haciendo esta bien por que yo no se mucho de esto, solo queria ayudar..

ahora para hacer mas de una istancia de la classe para
$db_o = new MySQL("localhost","root","","flp");
$db_d = new MySQL("localhost","root","","presta");
pues la pregunta seria ¿para que hacer mas de una instancia?
y la respuesta a esta pregunta le ira dando el codigo..... eso creo....

por otra parte tienes razon no lei el codigo .... es que toy cansado de leer madejas de codigos solo lei el titulo del post e hice mi comentario...
¿creo que es algo constructivo?

saludos!

Última edición por zerpico_01; 23/02/2010 a las 23:40
  #12 (permalink)  
Antiguo 24/02/2010, 07:38
Avatar de jackson666  
Fecha de Ingreso: noviembre-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 1.971
Antigüedad: 14 años, 5 meses
Puntos: 65
Respuesta: conexion a dos bases de datos.

Cita:
Iniciado por zerpico_01 Ver Mensaje
ahora para hacer mas de una istancia de la classe para
$db_o = new MySQL("localhost","root","","flp");
$db_d = new MySQL("localhost","root","","presta");
pues la pregunta seria ¿para que hacer mas de una instancia?
y la respuesta a esta pregunta le ira dando el codigo..... eso creo....
Para que mas de una instancia? Simple, porque el lo necesita asi. Como harias vos con esa clase para conectarte a dos bases de datos a la vez sin instanciar 2 objetos?

Cita:
Iniciado por zerpico_01 Ver Mensaje
por otra parte tienes razon no lei el codigo .... es que toy cansado de leer madejas de codigos solo lei el titulo del post e hice mi comentario...
Si estas cansado, podrias por lo menos tomarte la molestia de leer cual es el problema, o sino el mejor camino, ir a dormir
__________________
HV Studio
Diseño y desarrollo web

Etiquetas: bases, conexion, dos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:29.