Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Ayuda con clase de base de datos

Estas en el tema de Ayuda con clase de base de datos en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola a todos. Ultimamente he estado retocando mi clase de base de datos del modelo para manejar menos variables en los scripts de control. Por ...
  #1 (permalink)  
Antiguo 21/06/2010, 07:15
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 3 meses
Puntos: 44
Ayuda con clase de base de datos

Hola a todos.
Ultimamente he estado retocando mi clase de base de datos del modelo para manejar menos variables en los scripts de control. Por ejemplo, he metido la conexion a mysql dentro de una variable de clase.

Bueno, el tema es que ahora no funciona. Tampoco me arroja ningun error. He repasado varias veces el codigo, y seguro es una tontería, pero no lo veo. ¿alguien me puede decir qué tengo mal?

Un poco de mi codigo:
Código PHP:
class BaseDatos
{
    private 
$host;
    private 
$dbname;
    private 
$user;
    private 
$pass;
    private 
$conexion;

    function 
BaseDatos()
    {
        
$this->host "localhost";
        
$this->dbname "prueba";
        
$this->user "root";
        
$this->pass "";
    }

    public function 
Conectar()
    {
        
$this->conexion mysql_connect($this->host$this->user$this->pass);
        if (!
$this->conexion)
        {
            die (
'No se ha podido conectar: '.mysql_error());
        }
        
mysql_select_db($this->dbname$this->conexion) or die (mysql_error());
    }

    public function 
Consultar($consulta)
    {
        
$retorno mysql_query($consulta$this->conexion) or die (mysql_error());
        return 
$retorno;
    } 
EDIT: Os pongo como lo uso por si el error esta en otra parte

Código PHP:
class MiClase {
    
    private 
$basedatos;

    public function 
MiClase() {
        
$this->basedatos = new BaseDatos();
    }

    public function 
existeNombre($nombre) {

        
$this->basedatos->Conectar();
        
$res $this->basedatos->Consultar("SELECT nombre FROM usuarios WHERE nombre='$nombre'");
        
$existe_nombre $this->basedatos->numFilas($res);
        
$this->basedatos->Cerrar();

        if (
$existe_nombre 0) { 
            return 
true;
        }else{
            return 
false;
        }
    } 
Y en el control:

Código PHP:
$miclase = new MiClase();
$miclase->existeNombre('Pedro'); 
PD: Los requires están todos puestos, solo que no los he copiado aqui.
Gracias anticipadas por la ayuda.

Última edición por SetheR; 21/06/2010 a las 07:23
  #2 (permalink)  
Antiguo 21/06/2010, 07:27
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: Ayuda con clase de base de datos

Usa try y catch junto con Exception. También asegúrate que tengas activado e indicado como E_ALL solamente el error_reporting.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 21/06/2010, 08:06
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 3 meses
Puntos: 44
Respuesta: Ayuda con clase de base de datos

Gracias por responder abimaelrc.
He detectado el error, pero no se como solucionarlo. el caso es que en esta línea:
Código PHP:
 $this->conexion mysql_connect($this->host$this->user$this->pass); 
conexion toma el valor null.
Si en el siguiente if lo añado [if (!$this->conexion || $this->conexion == null)], entonces ya veo el error de mysql que me dice que es un parametro nulo.

Nunca lo había visto de ésta manera. ¿Qué puede ser?
  #4 (permalink)  
Antiguo 21/06/2010, 08:13
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Ayuda con clase de base de datos

Tienes activado el reporte de errores?
Tienes activada la extensión de MySQL?
  #5 (permalink)  
Antiguo 21/06/2010, 08:27
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 3 meses
Puntos: 44
Respuesta: Ayuda con clase de base de datos

Si y si.
Asi lo tengo en mi php.ini:

; http://php.net/error-reporting
error_reporting = E_ALL
....
;extension=php_mssql.dll
extension=php_mysql.dll
...

Si antes funcionaba todo bien. Solamente que he hecho unos cambios para no andar manejando conexiones en el control, prefiero que sea el modelo quien lo haga.
Os dejo mas pruebas que me confunden aun más:

He añadido un var_dumppara ver el valor de la conexion, justo debajo de donde le asignoel valor:
Código PHP:
$this->conexion mysql_connect($this->host$this->user$this->pass);
var_dump($this->conexion); 
y eso me devuelve:
resource(11, mysql link)

En cambio, si hago el var_dump en MiClase (donde getConexion solo retorna el atributo de clase conexion):

Código PHP:
$this->basedatos->Conectar();
var_dump($this->basedatos->getConexion()); 
me printa null.

¿Sugerencias? Gracias!
  #6 (permalink)  
Antiguo 21/06/2010, 09:43
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 3 meses
Puntos: 44
Respuesta: Ayuda con clase de base de datos

Bueno, tras un par de horas perdidas, ya he dado con el error y como suponía, no estaba en la clase que ya había revisado 7 millones de veces.

El fallo estaba en este metodo:
Código PHP:
    //Retorna una variable check de control (de momento)
    
public function coger($id$control) {

        
$check 0;

        if(!
$this->isBloqueado) {

            
$this->basedatos->Conectar();
            
$res $this->basedatos->Consultar("SELECT * FROM usuarios WHERE id = '$id'");

            if(
$this->basedatos->numFilas($res) > 0) {
                
$datos=$this->basedatos->getArray($res);
                
//operamos
               
            
}
            
//Cerramos la conexion
            
$this->basedatos->Cerrar();
        }else {
            
$check =0;
        }  
        return 
$check ;
    } 
El metodo Cerrar() parece que no puede ir ahí (aunque no se porqué). En cambio, si lo muevo dentro del otro if:

Código PHP:
    public function coger($id$control) {

        
$check 0;

        if(!
$this->isBloqueado) {

            
$this->basedatos->Conectar();
            
$res $this->basedatos->Consultar("SELECT * FROM usuarios WHERE id = '$id'");
            
//Cerramos la conexion
            
$this->basedatos->Cerrar();
            
             if(
$this->basedatos->numFilas($res) > 0) {
                
$datos=$this->basedatos->getArray($res);

                
//operamos
               
            
}
        }else {
            
$check =0;
        }  
        return 
$check ;
    } 
Funciona a la perfeccion. De momento me sirve para seguir programando, pero vamos, es una locura que no entiendo para nada.

saludos

offtopic:
Sabéis de un buen debug para Netbeans 6.8 y wamp para windows para evitar estas tonterías de nuevo? he probado x-debug pero no tira bien en wamp..

Última edición por SetheR; 21/06/2010 a las 09:51

Etiquetas: clase
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 04:46.