Foros del Web » Programando para Internet » PHP »

Pequeño lio con clases

Estas en el tema de Pequeño lio con clases en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 08/11/2012, 12:13
Avatar de pempas  
Fecha de Ingreso: diciembre-2003
Ubicación: Barcelona
Mensajes: 985
Antigüedad: 20 años, 4 meses
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!!
  #2 (permalink)  
Antiguo 08/11/2012, 23:00
Avatar de naiger67  
Fecha de Ingreso: enero-2011
Mensajes: 22
Antigüedad: 13 años, 3 meses
Puntos: 3
Respuesta: Pequeño lio con clases

Hola eso es un error mysql verifica bien el nombre de tu tabla al realizar la query, aveces phpMyadmin acentua o coloca en mayusculas el nombre de la tabla, en cuanto a tu modelo, no entiendo porq haz creado dos clases con con los mismos atributos y metodos, la idea de usar oop es reutilzar el codigo..
  #3 (permalink)  
Antiguo 09/11/2012, 07:14
Avatar de pempas  
Fecha de Ingreso: diciembre-2003
Ubicación: Barcelona
Mensajes: 985
Antigüedad: 20 años, 4 meses
Puntos: 6
Respuesta: Pequeño lio con clases

Hola naiger67,

ya eh comprobado que por el nombre de las tablas no es, son correctas.

¿Me podrías explicar de que modo podría crear una clase única para todas las bases de datos?

Muchas gracias.

Etiquetas: clases, lio, mysql, pequeño, sql, usuarios
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 09:00.