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

agregar métodos de otra clase

Estas en el tema de agregar métodos de otra clase en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, ya que termine de completar la clase de conexión quería crear una clase de "usuarios"... pero no sé como llamar los métodos de la ...
  #1 (permalink)  
Antiguo 19/02/2010, 12:23
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 3 meses
Puntos: 9
agregar métodos de otra clase

Hola, ya que termine de completar la clase de conexión quería crear una clase de "usuarios"... pero no sé como llamar los métodos de la clase "conexión" a la clase "usuarios" tales como ejecutar() numero_registros() etc... Para la clase conexión he usado el patrón singleton... cambias las cosas para ese caso?

Código PHP:
class Db{
     private 
$servidor;    
     private 
$usuario;    
     private 
$password;    
     private 
$base_datos;    
     private 
$link;    
     private 
$result
     private 
$num;   
     private 
$array;  
     static 
$_instance;     
       
     private function 
__construct(){
            
$this->setConexion();       
            
$this->conectar();
     }     
      
     private function 
setConexion(){
            
$conf Conf::getInstance();       
            
$this->servidor=$conf->getHostDB();       
            
$this->base_datos=$conf->getDB();       
            
$this->usuario=$conf->getUserDB();      
            
$this->password=$conf->getPassDB();    
     }     
      
     private function 
__clone(){ }  
       
     public static function 
getInstance(){
            if (!(
self::$_instance instanceof self)){
                
self::$_instance=new self();       
            }
            return 
self::$_instance;
     }     
     
     private function 
conectar(){
            
$link=mysql_connect($this->servidor$this->usuario$this->password); 
            if (
$link){      
                
mysql_select_db($this->base_datos,$link);       
                @
mysql_query("SET NAMES 'utf8'"); 
            } 
            if (!
$link){            
                exit(
'Error en la BD');
            }else{
                
$this->link=$link;    
            }           
     }
     
     
/*Método para ejecutar una sentencia sql*/    
     
public function ejecutar($sql){
            
$this->result=mysql_query($sql,$this->link) or die(mysql_error());
            return 
$this->result;    
     }
     
     
/*Método número de registros de query*/    
     
public function numero_registros($result){
            
$this->num=mysql_num_rows($result);
            return 
$this->num;    
     } 
          
     
/*Método para obtener una fila de resultados de la sentencia sql*/    
     
public function obtener_fila($result,$fila){
            if (
$fila==0){
                      
$this->array=mysql_fetch_array($result);       
            }else{
                      
mysql_data_seek($result,$fila);
                      
$this->array=mysql_fetch_array($result);
            }
            return 
$this->array;
     }   
    
     
     
//Método de seguridad de cadenas
     
public function setSecure($string){ 
        if(
is_string($string)){
           return 
mysql_real_escape_string(stripslashes(trim($string))); 
        }
     }  
     
     
/*cerrar la conexion*/
     
public function __destruct(){ 
         if (
is_resource($this->link)){
                @
mysql_close($this->link);
         }
     } 


Y esta es la clase que intento crear la de Usuarios:

Código PHP:
/*Incluimos el fichero de la clase Db*/
require_once 'dbConfig/Db.class.php';
/*Incluimos el fichero de la clase Conf*/
require_once 'dbConfig/Conf.class.php';

/* Clase encarga de gestionar al usuario */
class Users extends Db
     private 
$sql
     private 
$result;
     private 
$num;
     private 
$userID;
     static 
$_instance;     
        
     private function 
__construct(){
             
session_start();
            
$bd Db::getInstance();
     }
     
     public static function 
getInstance(){
            if (!(
self::$_instance instanceof self)){          
                
self::$_instance=new self();
            }       
            return 
self::$_instance;
     }
     
//Método login de los USUARIOS
     
public function login($usuario$password){ 
        
         
$sql="SELECT * FROM user WHERE ...";
        
$result=$this->ejecutar($sql);
        
$num=$this->numero_registros($result); 
        
        if(
$num 0){
            
$sql="SELECT * FROM user WHERE ....";
            
$result=$this->ejecutar($sql);
            
$num=$this->numero_registros($result);
    
            if(
$num>0){
                    while (
$x=$this->obtener_fila($result,0)){
                        
$userID=$x['customers_id']; 
                    }        
                    
$_SESSION["userID"]=$userID;
                    return 
1;
                    
            }
            else{
/*error de contraseña*/ return 0;}
        }
        else{
/*error de usuario*/ return 0;}
     } 
     
    public function 
getUserSession(){ 
        return 
$_SESSION["userID"]; 
    } 



Y aqui llamo al objeto:

Código PHP:
/*Incluimos el fichero de la clase Users*/
require_once 'lib/Users.class.php';
session_start();
//Invocamos al objeto usuario
$objUsers=Users::getInstance();
//Obtenemos los datos introducidos por el usuario
$usuario=$_POST["usuario"];   
$password=$_POST["password"]; 
//comprobamos si existe
$existe_Usuario=$objUsers->login($usuario,$password); 
if(
$existe_Usuario==1){ 
    echo 
"entro!";
}
else {
    echo 
"no es usuario!"


Pero cuando pruebo la clase en el formulario me muestra este error:

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in Db.class.php on line 65

Creo que no estoy instanciando bien la conexión a la clase de usuarios... y no sé si estoy invocando bien a los métodos, espero me puedan ayudar ya que estoy bien frio en la p.o.o. , gracias.
__________________
Quitenme la vida pero no la bebida.
  #2 (permalink)  
Antiguo 19/02/2010, 12:28
Avatar de SergeMedina  
Fecha de Ingreso: septiembre-2007
Ubicación: Guadalajara, Jalisco
Mensajes: 459
Antigüedad: 16 años, 7 meses
Puntos: 20
Respuesta: agregar métodos de otra clase

No heredes la clase Usuario de BD. En vez de eso puedes utilizar el patron mapper o lo siguiente:

Código PHP:
Ver original
  1. class Usuario{
  2.    
  3.    private $db;
  4.  
  5.    public function getDbConecction($params = null) {
  6.              
  7.            if($this->db === null) {
  8.                $this->db = Db::getInstance($params);
  9.           }
  10.            return $this->db;
  11.   }
  12.  
  13. }
__________________
I see dead pixels
  #3 (permalink)  
Antiguo 19/02/2010, 13:35
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: agregar métodos de otra clase

Hola, muchas gracias por responder, pero me podrías explicar lo que hace esa función? , debería poner el $this->db = Db::getInstance($params); en el constructor? y como invocaría a sus métodos?

Espero me puedas responder, muchas gracias.
__________________
Quitenme la vida pero no la bebida.
  #4 (permalink)  
Antiguo 19/02/2010, 14:04
Avatar de SergeMedina  
Fecha de Ingreso: septiembre-2007
Ubicación: Guadalajara, Jalisco
Mensajes: 459
Antigüedad: 16 años, 7 meses
Puntos: 20
Respuesta: agregar métodos de otra clase

Lo que hace ese metodo en la clase Usuario es asignar una instancia de la clase Db para que la puedas utilizar dentro de tu clase Usuario. Si la quieres usar en el metodo guardar usuario seria algo asi:

Código PHP:
Ver original
  1. class Usuario{
  2.        /**
  3.         .
  4.         .*/
  5.       public function guardar()  {
  6.             $this->db->ejectutar($queryGuardar);
  7.  
  8.       }
  9.  
  10.      
  11. }
__________________
I see dead pixels
  #5 (permalink)  
Antiguo 19/02/2010, 14:20
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: agregar métodos de otra clase

gracias por tu respuesta , lo he cambiado asi:

Código PHP:
/*Incluimos el fichero de la clase Db*/
require_once 'dbConfig/Db.class.php';
/*Incluimos el fichero de la clase Conf*/
require_once 'dbConfig/Conf.class.php';

/* Clase encarga de gestionar al usuario */
class Users
     private 
$db;
     private 
$sql
     private 
$result;
     private 
$num;
     private 
$userID;
     static 
$_instance;     
        
     public function 
__construct(){
             
session_start();
            
$this->getDbConecction();
     }
 
     public function 
getDbConecction($params null) {
            if(
$this->db === null) {
                
$this->db Db::getInstance($params);
            }
            return 
$this->db;
     }
     
     public static function 
getInstance(){
            if (!(
self::$_instance instanceof self)){          
                
self::$_instance=new self();
            }       
            return 
self::$_instance;
     }
     
//Método login de los USUARIOS
     
public function login($usuario$password){ 
        
         
$sql="SELECT * FROM...";
        
$result=$this->db->ejectutar($sql);
        
$num=$this->db->numero_registros($result); 
        
        if(
$num 0){
            
$sql="SELECT * FROM ...";
            
$result=$this->db->ejecutar($sql);
            
$num=$this->db->numero_registros($result);
    
            if(
$num>0){
                    while (
$x=$this->db->obtener_fila($result,0)){
                        
$userID=$x['user_id']; 
                    }        
                    
$_SESSION["userID"]=$userID;
                    return 
1;
                    
            }
            else{
/*error de contraseña*/ return 0;}
        }
        else{
/*error de usuario*/ return 0;}
     } 
     
    public function 
getUserSession(){ 
        return 
$_SESSION["userID"]; 
    } 


y

Código PHP:
/*Incluimos el fichero de la clase Users*/
require_once 'lib/Users.class.php';
session_start();
//Invocamos al objeto usuario
$objUsers=new Users();
//Obtenemos los datos introducidos por el usuario
$usuario=$_POST["usuario"];   
$password=$_POST["password"]; 
//comprobamos si existe
$existe_Usuario=$objUsers->login($usuario,$password); 
Edito: fue un error de digitación....y me falto poner la funcion getInstance() en el contructor... ahora si me funciona!!!!! muchas gracias !!!!

Edito2: Una ultima cosilla.... en un post anterior me pasaron una función para limpiar las cadenas antes de ponerlas en los query... esta tambien está en la clase Db:

Código PHP:
//Método de seguridad de cadenas
     
public function setSecure($string){ 
        if(
is_string($string)){
            
$this->cadena mysql_real_escape_string(stripslashes(trim($string)));
            return 
$this->cadena;
        }
     } 
Y las invoco en la funcion login de la clase Users:

Código PHP:
     public function login($usuario$password){ 
     
        
/*sanamos cadenas*/
        
$usuario $this->db->setSecure($usuario);
        
$password $this->db->setSecure($password);
        
                
$sql "SELECT * FROM...";
        
$result $this->db->ejecutar($sql);
        
$num $this->db->numero_registros($result); 
        
        if(
$num 0){
            
$sql "SELECT * FROM...";
            
$result $this->db->ejecutar($sql);
            
$num $this->db->numero_registros($result);
    
            if(
$num>0){
                    while (
$x $this->db->obtener_fila($result,0)){
                        
$userID=$x['user_id']; 
                    }        
                    
$_SESSION["userID"]=$userID;
                    return 
1;
                    
            }
            else{
/*error de contraseña*/ return 0;}
        }
        else{
/*error de usuario*/ return 0;}
     } 
Pero cuando pongo esto me sale el error: Fatal error: Call to undefined method Db::setSecure() on line 60 .... porque?
__________________
Quitenme la vida pero no la bebida.

Última edición por cesarpunk; 19/02/2010 a las 15:07

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 15:01.