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

Duda al pasar codigo estructurado a poo

Estas en el tema de Duda al pasar codigo estructurado a poo en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola gente que tal, recien estoy comenzando en esto de la programacion orientada a objetos y me esta costando bastante trabajo. El asunto es el ...
  #1 (permalink)  
Antiguo 17/12/2012, 16:03
 
Fecha de Ingreso: agosto-2012
Mensajes: 40
Antigüedad: 11 años, 8 meses
Puntos: 0
Duda al pasar codigo estructurado a poo

Hola gente que tal, recien estoy comenzando en esto de la programacion orientada a objetos y me esta costando bastante trabajo.

El asunto es el siguiente, lo primero que hice fue pasar la conexion a poo y hasta ahi anduvo todo joya!
El asunto ahora es hacer una clase producto en donde tenga los metodos para:
agregar, editar, borrar, mostrar...

Mi codigo estructurado es asi:

Código PHP:
if(isset($_POST['enviar'])){
        if(
$_POST['titulo'] != "" && $_POST['precio'] != "" ){
            if(
is_float($_POST['precio']) or is_numeric($_POST['precio'])){
                
$titulo_producto $_POST['titulo'];
                
$precio_producto $_POST['precio'];
                
$detalles_producto $_POST['descripcion'];
                
                
$sql "INSERT INTO producto (nombre_prod, precio_prod, detalles_prod) VALUES ('$titulo_producto', '$precio_producto', '$detalles_producto')";
                
$mysql->consulta($sql);
                
$error 1;
            }else{
                
$error 2;
            }
        }else {
            
$error 3;
        }
    } else{
        
$error 4;

como podria pasar ese codigo a un metodo?? los atributos de la clase producto son:
public $id;
public $nombre_prod;
public $precio_prod;
public $detalles_prod;

Gracias!
  #2 (permalink)  
Antiguo 17/12/2012, 16:34
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 2 meses
Puntos: 137
Respuesta: Duda al pasar codigo estructurado a poo

abstraete de las variables globales, puedes crear un metodo agredar
Código PHP:
Ver original
  1. public function agregar($nombre,$descripcion){
  2.     $sql = "INSERT  .....";
  3.     // ejecuta la consulta y regresa el id
  4. }
es mala practica usar $_POST y $_GET dentro de las clases php, mejor pasalos como parametros
Saludos
  #3 (permalink)  
Antiguo 17/12/2012, 16:40
 
Fecha de Ingreso: agosto-2012
Mensajes: 40
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Duda al pasar codigo estructurado a poo

Gracias por responder tan rapido!
Algunas dudas que tengo, el tema de la validacion del formulario la hago en el metodo o cuando vaya a instanciar la clase?
Otra cosa, para que conviene que regrese el id?

Saludos
  #4 (permalink)  
Antiguo 17/12/2012, 17:20
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 2 meses
Puntos: 137
Respuesta: Duda al pasar codigo estructurado a poo

regresar el id es bueno cuando trabajs con inserts, pero puedes regresar lo que quieres :P, y el validador ira cuando vayas a instanciar la clase
  #5 (permalink)  
Antiguo 18/12/2012, 13:46
 
Fecha de Ingreso: agosto-2012
Mensajes: 40
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Duda al pasar codigo estructurado a poo

Bueno lo hice como me dijiste. Por un lado tengo la class producto que es asi:

Código PHP:
<?php
    
class producto extends MySQL{
        private 
$id;
        private 
$nombre_prod;
        private 
$precio_prod;
        private 
$detalles_prod;
        private 
$stock;
    
        public function 
__construct($nombre_prod$precio_prod$detalles_prod$stock){
            
$this->nombre_prod $nombre_prod;
            
$this->precio_prod $precio_prod;
            
$this->detalles_prod $detalles_prod;
        }
        
        public function 
addProd($nombre_prod$precio_prod$detalles_prod$stock){
            
$sql "INSERT INTO producto (nombre_prod, precio_prod, detalles_prod, stock_prod) VALUES ('$nombre_prod', '$precio_prod', '$detalles_prod', '$stock')";
            @
mysql_query($sql$cnx);
        }
    }
?>
Y por el otro tengo mi formulario y mi codigo php en donde instancio el objeto y le paso los parametros asi:

Código PHP:
<?php
    
include('includes/class/class_cnx.php');
    include(
'includes/class/class_addprod.php');
    
$mysql = new MySQL('localhost','root','','panel_adm');

    if(isset(
$_POST['enviar'])){
        if(
$_POST['titulo'] != "" && $_POST['precio'] != "" ){
            if(
is_float($_POST['precio']) or is_numeric($_POST['precio'])){
                
$titulo_producto $_POST['titulo'];
                
$precio_producto $_POST['precio'];
                
$detalles_producto $_POST['descripcion'];
                
$stock $_POST['stock'];
                
                
$producto = new producto($titulo_producto$precio_producto$detalles_producto$stock);
                
$producto->addProd($titulo_producto$precio_producto$detalles_producto$stock);
            }
        }        
    }
Lleno el formulario, le doy a enviar pero no se inserta nada en la base de datos, los nombres y variables estan bien escritas. Que puede ser? Como cuesta programar en poo!!!
  #6 (permalink)  
Antiguo 18/12/2012, 14:04
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 2 meses
Puntos: 137
Respuesta: Duda al pasar codigo estructurado a poo

@mysql_query($sql, $cnx);
bueno, primero, no uses el "@" para suprimir errores, segundo, la variable $cnx no esta por ninguna parte
Saludos
  #7 (permalink)  
Antiguo 18/12/2012, 16:29
 
Fecha de Ingreso: agosto-2012
Mensajes: 40
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Duda al pasar codigo estructurado a poo

La variable $cnx es un atributo de mi class de conexion, como hago para heredarla :S
  #8 (permalink)  
Antiguo 18/12/2012, 16:44
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 2 meses
Puntos: 137
Respuesta: Duda al pasar codigo estructurado a poo

los atributos se acceden desde $this, si en la clase MySQL tienes
$this->cnx = conexion;
puedes usarla, si solamente haces
$cnx = conexion;
no puedes usarla en los metodos, solo en el metodo donde la defines
Puedes poner el codigo de MySQL?
  #9 (permalink)  
Antiguo 18/12/2012, 16:45
 
Fecha de Ingreso: agosto-2012
Mensajes: 40
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Duda al pasar codigo estructurado a poo

Mmmm no te entendi mucho, aca te dejo mi class de conexion:

Código PHP:
<?php
class MySQL {
    
//Atributos de la conexion
    
private $hostname_cnx;
    private 
$database_cnx;
    private 
$username_cnx;
    private 
$pass_cnx;
    private 
$cnx;
    private 
$error_cnx "No se ha podido conectar a la Base de datos";
    
    
//Metodos
    
    //Funcion para conectar a la base de datos
    
public function __construct($hostname_cnx$username_cnx$pass_cnx$database_cnx ){
        
$this->hostname_cnx $hostname_cnx;
        
$this->username_cnx $username_cnx;
        
$this->pass_cnx $pass_cnx;
        
$this->database_cnx $database_cnx;
        @
$this->cnx mysql_pconnect($this->hostname_cnx$this->username_cnx$this->pass_cnx) or die ($this->error_cnx);
        @
$db_seleccionar mysql_select_db($this->database_cnx$this->cnx);    
    }
    
    
//Funcion para desconectar a la base de datos
    
public function desconectar(){
        if(
$this->flag == true){
            @
mysql_close($this->cnx);
        }
    }
    
    
//Esta funcion selecciona la bd y hace una consulta
    
public function consulta($query){
        return @
mysql_db_query($this->database_cnx,$query);        
    }
    
    
//Funcion que guarda una fila de resultados
    
public function filas($query){
        return @
mysql_fetch_assoc($query);
    }
}
?>
gracias :)
  #10 (permalink)  
Antiguo 18/12/2012, 16:53
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 2 meses
Puntos: 137
Respuesta: Duda al pasar codigo estructurado a poo

bueno si la estas haciendo bien pero hablando de visibilidad, la variable $this->cnx es privada, y no se puede acceder desde otra clase nisiquiera extendiendola, cambia
private $cnx;
por
protected $cnx;
asi podras accesar a ella desde las clases que extiendan,
  #11 (permalink)  
Antiguo 18/12/2012, 17:21
 
Fecha de Ingreso: agosto-2012
Mensajes: 40
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Duda al pasar codigo estructurado a poo

Ahi cambie a protected el atributo $cnx pero al hacer el insert me regresa este error:

Warning: mysql_query() expects parameter 2 to be resource, null given in C:\xampp\htdocs\panel_adm\includes\class\class_add prod.php on line 17

A la variable $cnx la accedi desde $this->cnx, por ende el metodo para agregar un producto me quedo asi:

Código PHP:
public function addProd($nombre_prod$precio_prod$detalles_prod$stock){
            
$sql "INSERT INTO producto (nombre_prod, precio_prod, detalles_prod, stock_prod) VALUES ('$nombre_prod', '$precio_prod', '$detalles_prod', '$stock')";
            
mysql_query($sql$this->cnx);
        } 
Evidentemente el problema es la variable $cnx que esta nula...

Disculpame que te vuelva loco, no logro entenderlo!
  #12 (permalink)  
Antiguo 18/12/2012, 19:31
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 2 meses
Puntos: 137
Respuesta: Duda al pasar codigo estructurado a poo

primero quita todos los arrobas de los métodos :P así quizás veas el error
  #13 (permalink)  
Antiguo 18/12/2012, 20:06
 
Fecha de Ingreso: agosto-2012
Mensajes: 40
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Duda al pasar codigo estructurado a poo

Tira el mismo error =( $cnx esta null en el metodo de la clase producto pero en el metodo de conexion funciona perfecto, sino no se conectaria a la bd
  #14 (permalink)  
Antiguo 18/12/2012, 20:30
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 2 meses
Puntos: 137
Respuesta: Duda al pasar codigo estructurado a poo

ahh ya se
estas sobrreescribiendo el metodo construct, y si lo miras tu diseno esta mal, la clase producto no deberia extender mysql deberia usar la clase producto, osea que en vez de extender deberias tener un atribute $this->db que sea la instancia de MySQL, si entiendes?
Saludos
  #15 (permalink)  
Antiguo 18/12/2012, 21:19
 
Fecha de Ingreso: agosto-2012
Mensajes: 40
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Duda al pasar codigo estructurado a poo

La verdad que no, perdon por ser tan cabeza dura.
Osea que tendria que agregarle un atributo a la clase producto que sea $bd por ejemplo... Pero que datos deberia asignarle a ese atributo? como debo hacerlo??

Gracias!!!!
  #16 (permalink)  
Antiguo 19/12/2012, 13:43
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 2 meses
Puntos: 137
Respuesta: Duda al pasar codigo estructurado a poo

Código PHP:
Ver original
  1. <?php
  2. class MySQL {
  3.     //Atributos de la conexion
  4.     private $hostname_cnx;
  5.     private $database_cnx;
  6.     private $username_cnx;
  7.     private $pass_cnx;
  8.     private $cnx;
  9.     private $error_cnx = "No se ha podido conectar a la Base de datos";
  10.      
  11.     //Metodos
  12.      
  13.     //Funcion para conectar a la base de datos
  14.     public function __construct($hostname_cnx, $username_cnx, $pass_cnx, $database_cnx ){
  15.         $this->hostname_cnx = $hostname_cnx;
  16.         $this->username_cnx = $username_cnx;
  17.         $this->pass_cnx = $pass_cnx;
  18.         $this->database_cnx = $database_cnx;
  19.         $this->cnx = mysql_pconnect($this->hostname_cnx, $this->username_cnx, $this->pass_cnx) or die ($this->error_cnx);
  20.         $db_seleccionar = mysql_select_db($this->database_cnx, $this->cnx);
  21.     }
  22.      
  23.     //Funcion para desconectar a la base de datos
  24.     public function desconectar(){
  25.         if($this->flag == true){
  26.             mysql_close($this->cnx);
  27.         }
  28.     }
  29.      
  30.     //Esta funcion selecciona la bd y hace una consulta
  31.     public function consulta($query){
  32.         return mysql_db_query($this->database_cnx,$query);        
  33.     }
  34.      
  35.     //Funcion que guarda una fila de resultados
  36.     public function filas($query){
  37.         return mysql_fetch_assoc($query);
  38.     }
  39.  
  40.     public function getDb(){
  41.         return $this->cnx;
  42.     }
  43. }
  44.     class producto{
  45.         private $id;
  46.         private $nombre_prod;
  47.         private $precio_prod;
  48.         private $detalles_prod;
  49.         private $stock;
  50.  
  51.         private $_db;
  52.      
  53.         public function __construct($nombre_prod, $precio_prod, $detalles_prod, $stock){
  54.             $this->nombre_prod = $nombre_prod;
  55.             $this->precio_prod = $precio_prod;
  56.             $this->detalles_prod = $detalles_prod;
  57.         }
  58.          
  59.         public function addProd($nombre_prod, $precio_prod, $detalles_prod, $stock){
  60.             $sql = "INSERT INTO producto (nombre_prod, precio_prod, detalles_prod, stock_prod) VALUES ('$nombre_prod', '$precio_prod', '$detalles_prod', '$stock')";
  61.             mysql_query($sql, $this->_db);
  62.         }
  63.  
  64.         public function setDb($db){
  65.             $this->_db = $db;
  66.         }
  67.     }
  68. $db = new MySQL();
  69. $producto = new producto();
  70. $producto->setDb($db);
  71. $producto->addProd();
checa eso, no funcionara porque esta a modo de prototipo, pero es lo que podrias hacer
Saludos
  #17 (permalink)  
Antiguo 19/12/2012, 16:29
 
Fecha de Ingreso: agosto-2012
Mensajes: 40
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Duda al pasar codigo estructurado a poo

Gracias por la ultima respuesta!!! me fuiste guiando por el buen sendero y al final me termino saliendo y logre entenderlo.

Hice que funcionara pero no se si el codigo es el optimo, aca dejo como lo termine haciendo.

Class producto:

Código PHP:
<?php
    
class producto{
        private 
$id;
        private 
$nombre_prod;
        private 
$precio_prod;
        private 
$detalles_prod;
        private 
$stock;
        private 
$cnx_db;
    
        public function 
__construct($nombre_prod$precio_prod$detalles_prod$stock){
            
$this->nombre_prod $nombre_prod;
            
$this->precio_prod $precio_prod;
            
$this->detalles_prod $detalles_prod;
        }
        
         public function 
setDb($host$name$pass){
            
$this->cnx_db mysql_pconnect($host$name$pass);
        }
        
        public function 
addProd($nombre_prod$precio_prod$detalles_prod$stock){
            
$sql "INSERT INTO producto (nombre_prod, precio_prod, detalles_prod, stock_prod) VALUES ('$nombre_prod', '$precio_prod', '$detalles_prod', '$stock')";
            
mysql_query($sql$this->cnx_db);
        }
        
        
    }
?>
Despues Instancie un objeto y el metodo setDb con sus parametros:

Código PHP:
<?php
    
include('includes/class/class_cnx.php');
    include(
'includes/class/class_addprod.php');
    
$mysql = new MySQL('localhost','root','','panel_adm');
    
    if(isset(
$_POST['enviar'])){
        if(
$_POST['titulo'] != "" && $_POST['precio'] != "" ){
            if(
is_float($_POST['precio']) or is_numeric($_POST['precio'])){
                
$titulo_producto $_POST['titulo'];
                
$precio_producto $_POST['precio'];
                
$detalles_producto $_POST['descripcion'];
                
$stock $_POST['stock'];
                
                
$producto = new producto($titulo_producto$precio_producto$detalles_producto$stock);
                
$producto->setDb('localhost''root''');
                
$producto->addProd($titulo_producto$precio_producto$detalles_producto$stock);
            }
        }        
    }
?>
La cosa es que tuve que agregarle los parametros al setDb manualmente, pudiendo tal ves haberlos heredado de la class mysql que es asi:

Código PHP:
<?php
class MySQL {
    
//Atributos de la conexion
    
private $hostname_cnx;
    private 
$database_cnx;
    private 
$username_cnx;
    private 
$pass_cnx;
    protected 
$cnx;
    private 
$error_cnx "No se ha podido conectar a la Base de datos";
    
    
//Metodos
    
    //Funcion para conectar a la base de datos
    
public function __construct($hostname_cnx$username_cnx$pass_cnx$database_cnx){
        
$this->hostname_cnx $hostname_cnx;
        
$this->username_cnx $username_cnx;
        
$this->pass_cnx $pass_cnx;
        
$this->database_cnx $database_cnx;
        
$this->cnx mysql_pconnect($this->hostname_cnx$this->username_cnx$this->pass_cnx) or die ($this->error_cnx);
        
$db_seleccionar mysql_select_db($this->database_cnx$this->cnx);    
    }
    
    
//Funcion para desconectar a la base de datos
    
public function desconectar(){
        if(
$this->flag == true){
            
mysql_close($this->cnx);
        }
    }
    
    
//Esta funcion selecciona la bd y hace una consulta
    
public function consulta($query){
        return 
mysql_db_query($this->database_cnx,$query);        
    }
    
    
//Funcion que guarda una fila de resultados
    
public function filas($query){
        return 
mysql_fetch_assoc($query);
   }
   
   
//Retorna la conexion
    
public function getDb(){
        return 
$this->cnx;
    }
}
?>
Gracias por todo amigo :)
  #18 (permalink)  
Antiguo 19/12/2012, 16:46
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 2 meses
Puntos: 137
Respuesta: Duda al pasar codigo estructurado a poo

creo que tienes un problema, haces dos conexiones.
setDb no debería crear una conexión, sino reusar una que ya existe, por eso le pase como parámetro el valor que regresa getDb,
Código PHP:
Ver original
  1. class producto{
  2. //codigo
  3.         public function setDb($db){
  4.             $this->cnx_db = $db
  5.         }
  6. //codigo
  7. }
  8.  
  9. $db = new MySQL();
  10. $producto = new producto()
  11. $producto->setDb($db->getDb);
  #19 (permalink)  
Antiguo 19/12/2012, 17:09
 
Fecha de Ingreso: agosto-2012
Mensajes: 40
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Duda al pasar codigo estructurado a poo

Es que usando como parametro lo que retorna el setDb me tira el siguiente error:

Notice: Undefined property: MySQL::$getDb in C:\xampp\htdocs\panel_adm\cargar_prod.php on line 15

Tiene que ver con la herencia? Cambie la visibilidad del atributo $cnx por public pero me sigue tirando ese mismo error...
  #20 (permalink)  
Antiguo 19/12/2012, 17:13
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 2 meses
Puntos: 137
Respuesta: Duda al pasar codigo estructurado a poo

Código PHP:
Ver original
  1. $db = new MySQL();
  2. $producto = new producto()
  3. $producto->setDb($db->getDb());
olvide los parentesis :P
  #21 (permalink)  
Antiguo 19/12/2012, 17:14
 
Fecha de Ingreso: agosto-2012
Mensajes: 40
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Duda al pasar codigo estructurado a poo

jajaja si justo estaba editando el post porq lo habia resuelto :p gracias por tomarte el tiempo capo! me ayudaste a despejar muchas dudas
  #22 (permalink)  
Antiguo 19/12/2012, 17:23
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 2 meses
Puntos: 137
Respuesta: Duda al pasar codigo estructurado a poo

de nada ;)

Etiquetas: clase, poo
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 17:21.