Ver Mensaje Individual
  #1 (permalink)  
Antiguo 08/11/2012, 12:13
Avatar de pempas
pempas
 
Fecha de Ingreso: diciembre-2003
Ubicación: Barcelona
Mensajes: 985
Antigüedad: 21 años
Puntos: 6
Pequeño lio con clases

Buenas a todo el mundo,
recientemente me acabo de inciar en la programación con Php, hasta ahora habíamos estado trabajando con .Net y tengo una serie de dudas que no se muy bien como resolver.

En concreto es sobre bases de datos, tenemos una pequeña aplicación que utiliza diversas bases de datos, para conectar a cada una de ellas usamos una clase, que se compone de lo siguiente:

Código PHP:
<?php
class Conbd {
    public static 
$conlocal NULL;
    private 
$result NULL;
    private 
$server 1;    // 0 == abajo, 1 == arriba
        
    
public function __construct() {
        if (
is_null(self::$conlocal)) {
            if (
$this->server == 0$password ''; else $password 'elquesea';
            
            
self::$conlocal mysql_connect('localhost''usuario'$password);
            if (!
self::$conlocal) die('No se pudo conectar a la base de datos: ' mysql_error());
            if (!
mysql_select_db('base_de_datos',self::$conlocal)) die('No se pudo seleccionar la base de datos: ' mysql_error());
        }
        return 
self::$conlocal;
    }
    
    public function 
fetchArray(){
      return 
mysql_fetch_array($this->result);
    }
    
    public function 
fetchAssoc() {
        return 
mysql_fetch_assoc($this->result);
    }
    
    public function 
freeResult() {
        
mysql_free_result($this->result);
    }

    public function 
insertId() {
        return 
mysql_insert_id(self::$conlocal);
    }
    
    public function 
numRows(){
      return 
mysql_num_rows($this->result);
    }
    
    public function 
sqlExec($sql){
        
$this->result mysql_query($sql,self::$conlocal);
        if (!
$this->result) die('No se pudo ejecutar consulta: ' mysql_error());
    }
    
    public function 
close(){
      
mysql_close(self::$conlocal);
      
$this->freeResult($this->result);
      unset(
$this->result);
    }
    
}
?>
La segunda clase es para la otra base de datos es:

Código PHP:
<?php
class Conbd_elastix {
    private static 
$conelastix NULL;
    private 
$result NULL;
    private 
$server 1;    // 0 == abajo, 1 == arriba
        
    
public function __construct() {
        if (
is_null(self::$conelastix)) {
            if (
$this->server == 0$password ''; else $password 'elquesea';
            
            
self::$conelastix mysql_connect('localhost''usuario'$password);
            if (!
self::$conelastix) die('No se pudo conectar a la base de datos: ' mysql_error());
            if (!
mysql_select_db('base_de_datos2',self::$conelastix)) die('No se pudo seleccionar la base de datos: ' mysql_error());
        }
        return 
self::$conelastix;
    }
    
    public function 
fetchArray(){
      return 
mysql_fetch_array($this->result);
    }
    
    public function 
fetchAssoc() {
        return 
mysql_fetch_assoc($this->result);
    }
    
    public function 
freeResult() {
        
mysql_free_result($this->result);
    }

    public function 
insertId() {
        return 
mysql_insert_id(self::$conelastix);
    }
    
    public function 
numRows(){
      return 
mysql_num_rows($this->result);
    }
    
    public function 
sqlExec($sql){
        
$this->result mysql_query($sql,self::$conelastix);
        if (!
$this->result) die('No se pudo ejecutar consulta: ' mysql_error());
    }
    
    public function 
close(){
      
mysql_close(self::$conelastix);
      
$this->freeResult($this->result);
      unset(
$this->result);
    }
    
}
?>
Hasta aquí todo correcto, en mi "index.php" referencio las clases así:

Código PHP:
require_once "includes/Conbd.php";
require_once 
"includes/Conbd_elastix.php";
$conlocal = new Conbd();
$centralita = new Conbd_elastix(); 
Luego, si por ejemplo quiero ejecutar una porción de código que usa datos de las dos bases de datos, hago esto:

Código PHP:
$sql "Select * From clientes Where id='".$_GET["id"]."';";
$conlocal->sqlExec($sql);
while(
$row $conlocal->fetchAssoc()) {

  
$dato $row["dato1"];

  
// Aquí saco datos de la otra base de datos
  
$sql "Select * From clientes2 Where id='".$_GET["id"]."';";
  
$centralita->sqlExec($sql);
  while(
$row1 $centralita->fetchAssoc()) {
     
$dato2 $row1["dato2"];
  }


El fallo se produce exactamente en el punto en el que intento sacar datos de la segunda base de datos, me escupe:

"table base_de_datos2.clientes2" doesn't exist"

Como si estuviese sacando los datos de $conlocal en vez de $centralita, ¡¡Cuando eh referenciado hacia la conexión de centralita!!

Creo que debe de haber un problema de herencias en las clases o algo similar porque es como si estuviesen compartiendo las conexiones, no lo acabo de entender la verdad...

Me tiene loco, y no sé que hacer, ¿alguien de ustedes me podría ayudar?

Gracias!!