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

Duda con error en PHP OO

Estas en el tema de Duda con error en PHP OO en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola! buenas tardes... Tengo una duda con un error que me arroja mi código en PHP , aún me falta comprender bien la POO , ...
  #1 (permalink)  
Antiguo 02/06/2012, 16:38
Avatar de Middrel  
Fecha de Ingreso: abril-2005
Mensajes: 835
Antigüedad: 19 años
Puntos: 27
Duda con error en PHP OO

Hola! buenas tardes...

Tengo una duda con un error que me arroja mi código en PHP, aún me falta comprender bien la POO, supongo que por ello no encuentro la solución. Bueno, la idea es insertar registros en una tabla de una base de datos, les muestro los archivos que realizan esto:

Este es el archivo [admin-form-clientes.php]que muestra la información en pantalla (Vista):

Código PHP:
<!-- Formulario para alta de clientes al sistema -->
<
form action="bd/admin-RegCliente.php" method="post" id="formulario-cliente">
    <
div class="campos-form">
        <
h1>Datos Generales del Cliente</h1>
            <
p>
                
Código <input type="text" name="codigo" id="codigo" size="5%" required=""/>
                
Nombre <input type="text" name="nombre" id="nombre" size="73%" required="" />
            </
p>
            <
p>
                
Teléfono <input type="tel" name="telefono" id="telefono" size="25%" />
                
e-mail <input type="email" name="email" id="email" size="53%" />
            </
p>
            <
p>
                
Calle <input type="text" name="calle" id="calle" size="47%" required="" />
                
NoInt <input type="text" name="int" id="int" size="2%" required="" />
                
NoExt <input type="text" name="ext" id="ext" size="2%" required="" />
                
CP <input type="text" name="cp" id="cp" size="6%"  />
            </
p>
            <
p>
                
Colonia <input type="text" name="colonia" id="colonia" size="45%" required="" />
                
Delegación <input type="text" name="deleg" id="deleg" size="30%" required="" />
            </
p>
            <
p>
                
Estatus <input type="text" name="estatus" id="estatus" size="2%" required="" />
            </
p>
        </
div>
        <
div class="botones-form">
            <
input type="submit" name="enviar" id="enviar" value="Guardar" onclick="valida();" />
            <
input type="reset" name="limpiar" id="limpiar" value="Limpiar"/>
        </
div>
</
form
Con este otro realizo la conexión a la base de datos [admin-conexion.php]:

Código PHP:
<?php 
    
    
/* Creamos la clase para la conexión a la base de datos*/
    
class Conexion {
        
        var 
$bd;
        var 
$serv;
        var 
$user;
        var 
$pass
        var 
$conexion;
        var 
$Errno 0;
        var 
$Error "";
        
        
/* Constructor a la BD*/
        
function ConexionConst() {
            
            
$this->bd "bd_filmoteca";
            
$this->serv "localhost";
            
$this->user "root";
            
$this->pass "";
            
        }
        
        
/* Comenzamos con la conexión */
        
function ConexionBD() {
            
            
$this->conexion mysql_connect($this->serv$this->user$this->pass);
            
/* Si falla no nos podremos conectar*/
            
if(!$this->conexion) {
                
$this->Error "La conexión no pudo ser realizada";
                return 
0;
            }
            
/* Elegimos bd */
            
if(!@mysqli_select_db($this->bd$this->conexion)){
                
$this->Error "No se puede abrir la base de datos" $this->bd;
                return 
0;
            }
            
/* Si todo sale bien me regresa la conexión */
            
return $this->conexion;
        }
    }
?>
El siguiente archivo recoge la información del formulario [admin-RegCliente.php]

Código PHP:
<?php 

    
include_once("RegCliente.php");

    
$cliente = new RegCliente();
    
    
$cliente->setcodigo($_REQUEST['codigo']); 
    
$cliente->setnombre($_REQUEST['nombre']);
    
$cliente->settelefono($_REQUEST['telefono']);
    
$cliente->setemail($_REQUEST['email']);
    
$cliente->setcalle($_REQUEST['calle']);
    
$cliente->setint($_REQUEST['int']);
    
$cliente->setext($_REQUEST['ext']);
    
$cliente->setcp($_REQUEST['cp']);
    
$cliente->setcolonia($_REQUEST['colonia']);
    
$cliente->setdelegacion($_REQUEST['deleg']);
    
$cliente->setestatus($_REQUEST['estatus']);
    
    
$regCliente->$cliente->RegClienteBD();    

?>
y por último, este archivo envia la información a la base de datos [RegCliente.php]

Código PHP:
<?php
    
    
include_once('admin-conexion.php');
    
    class 
RegCliente {
        
        private 
$codigo;
        private 
$nombre;
        private 
$telefono;
        private 
$email;
        private 
$calle;
        private 
$int;
        private 
$ext;
        private 
$cp;
        private 
$colonia;
        private 
$delegacion;
        private 
$estatus;
        
        function 
RegClienteBD() {
            
$regCliente;
            
            try {
            
                
$conectar = new Conexion();
                
$cn->$conectar->ConexionBD();
                
                
mysql_query("BEGIN",$cn);
                
$sql "INSERT INTO films_clientes VALUES('$this->codigo','$this->nombre',$this->telefono,'$this->email','$this->calle','$this->int','$this->ext',$this->cp,'$this->colonia','$this->delegacion','$this->estatus')";
                
$result mysql_query($sql,$cn);
                
                if(!
$result){
                    
mysql_query("ROLLBACK",$cn);
                    
$regCliente FALSE;
                } else {
                    
mysql_query("COMMIT",$cn);
                    
$regCliente TRUE;
                }
                
                
mysql_close($cn);
                
            } catch (
exception $e) {}
            
            return 
$regCliente;            
        }                
    }
?>
Al pulsar el botón de enviar me marca el siguiente error:

Fatal error: Call to undefined method RegCliente::setcodigo() in C:\xampp\htdocs\proyecto_peliculas\bd\admin-RegCliente.php on line 7

Sólo que no identifico el porque de este error, ¿alguien tendrá alguna idea?

Como dato adicional, ya he podido enviar datos a una base mediante programación en PHP, más no en PHP OO, utilizo XAMPP por si les sirve como nota adicional.

De antemano les agradezco sus comentarios.
  #2 (permalink)  
Antiguo 02/06/2012, 17:25
Avatar de Uncontroled_Duck
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Málaga [Spain]
Mensajes: 806
Antigüedad: 12 años, 11 meses
Puntos: 261
Respuesta: Duda con error en PHP OO

Fatal error: Call to undefined method RegCliente::setcodigo() in C:\xampp\htdocs\proyecto_peliculas\bd\admin-RegCliente.php on line 7

Básicamente te dice que en el archivo admin-RegCliente.php línea 7 estas llamando una función no definida, o lo que es lo mismo, no existe.
Código PHP:
class RegCliente
{
    private 
$codigo;

    
/**
     * La clase sin contenido
     */
    
public function RegClienteBD()
    {
        
//...
    
}

Cuando llamas
Código PHP:
$cliente = new RegCliente();
$cliente->setcodigo() 
Realmente estás llamando a una clase como esta:
Código PHP:
class RegCliente # <-- $cliente = new RegCliente();
{
    private 
$codigo;

    
/**
     * La clase sin contenido
     */
    
public function RegClienteBD()
    {
        
//...
    
}

    public function 
setcodigo() # <-- $cliente->setcodigo()
    
{
        
//...
    
}

Para asignar valor a las propiedades sin crear métodos puede servirte esto: __get() __set()
http://php.net/manual/es/language.oop5.overloading.php

De esta forma asignarías los valores así:
Código PHP:
$cliente = new RegCliente();
$cliente->codigo $_REQUEST['codigo']; 
PD.: No he mirado el resto del código, solo lo que da error.

Saludos,
__________________
Todos agradeceremos que pongas el código en su respectivo Highlight
  #3 (permalink)  
Antiguo 02/06/2012, 20:17
Avatar de Ribon  
Fecha de Ingreso: septiembre-2010
Ubicación: El firmamento
Mensajes: 487
Antigüedad: 13 años, 7 meses
Puntos: 91
Respuesta: Duda con error en PHP OO

Los getters y setters no son funciones mágicas y deben ser declaradas dentro de todas las clases PHP en que quieras encapsular tus atributos privados (o protegidos)

por lo que en tu clase RegCliente has de definir todos los métodos getter y setter para cada uno de los atributos (set_codigo($codigo), set_nombre($nombre) ... etc)

Hay IDEs que realizan inserciones de códigos que te pueden ayudar a no "darte la paja" de crear todos estos métodos, como Eclipse o NetBeans.

acá hay otro recurso que explica de otra manera como implementar rapidamente los getters y setters y así tener encapsulados tus atributos.

http://www.php.net/manual/es/languag...agic.php#98442

Espero sea de ayuda, saludos =)
__________________
Utilice el Highlight para mostrar código, mis ojos se lo agradecerán :)
qué es esto? :O -> http://i48.tinypic.com/5x3kzs.png
Ya sabes :)
  #4 (permalink)  
Antiguo 02/06/2012, 22:49
Avatar de Middrel  
Fecha de Ingreso: abril-2005
Mensajes: 835
Antigüedad: 19 años
Puntos: 27
Respuesta: Duda con error en PHP OO

Tenían razón, no había definido los set's y get's de la clase...

Código PHP:
/* Inioializamos Get de la clase */
        
function getcodigo() { return $this->codigo; }
        function 
getnombre() { return $this->nombre; }
        function 
gettelefono() { return $this->telefono; }
        function 
getemail() { return $this->email; }
        function 
getcalle() { return $this->calle; }
        function 
getint() { return $this->int; }
        function 
getext() { return $this->ext; }
        function 
getcp() { return $this->cp; }
        function 
getcolonia() { return $this->colonia; }
        function 
getdelegacion() { return $this->delegacion; }
        function 
getestatus() { return $this->estatus; }
        
        
/* Inicializamos Set de la clase*/
        
        
function setcodigo($codigo) { $this->codigo $codigo;     }
        function 
setnombre($nombre) { $this->nombre $nombre;     }
        function 
settelefono($telefono) { $this->telefono $telefono;     }
        function 
setemail($email) { $this->email $email;     }
        function 
setcalle($calle) { $this->calle $calle;     }
        function 
setint($int) { $this->int $int;     }
        function 
setext($ext) { $this->ext $ext;     }
        function 
setcp($cp) { $this->cp $cp;     }
        function 
setcolonia($colonia) { $this->colonia $colonia;     }
        function 
setdelegacion($delegacion) { $this->delegacion $delegacion;     }
        function 
setestatus($estatus) { $this->estatus $estatus;     } 
Bueno, ese error se corrigió, pero me aparece el siguiente:

Warning: mysql_query() expects parameter 2 to be resource, integer given in C:\xampp\htdocs\proyecto_peliculas\bd\RegCliente.p hp on line 27

Warning: mysql_query() expects parameter 2 to be resource, integer given in C:\xampp\htdocs\proyecto_peliculas\bd\RegCliente.p hp on line 29

Warning: mysql_query() expects parameter 2 to be resource, integer given in C:\xampp\htdocs\proyecto_peliculas\bd\RegCliente.p hp on line 32

Warning: mysql_close() expects parameter 1 to be resource, integer given in C:\xampp\htdocs\proyecto_peliculas\bd\RegCliente.p hp on line 39


que son generados de este código[Regcliente.php]:

Código PHP:
<?php
    
    
include_once('admin-conexion.php');
    
    class 
RegCliente {
        
        private 
$codigo;
        private 
$nombre;
        private 
$telefono;
        private 
$email;
        private 
$calle;
        private 
$int;
        private 
$ext;
        private 
$cp;
        private 
$colonia;
        private 
$delegacion;
        private 
$estatus;
        
        function 
RegClienteBD() {
            
$regCliente;
            
            try {
            
                
$conectar = new Conexion();
                
$cn $conectar->ConexionBD();
                
                
mysql_query("BEGIN",$cn);
                
$sql "INSERT INTO films_clientes VALUES('$this->codigo','$this->nombre','$this->telefono','$this->email','$this->calle','$this->int','$this->ext',$this->cp,'$this->colonia','$this->delegacion','$this->estatus')";
                
$result mysql_query($sql,$cn);
                
                if(!
$result){
                    
mysql_query("ROLLBACK",$cn);
                    
$regCliente FALSE;
                } else {
                    
mysql_query("COMMIT",$cn);
                    
$regCliente TRUE;
                }
                
                
mysql_close($cn);
                
            } catch (
exception $e) {}
            
            return 
$regCliente;            
        }
        
        
/* Inioializamos Get de la clase */
        
function getcodigo() { return $this->codigo; }
        function 
getnombre() { return $this->nombre; }
        function 
gettelefono() { return $this->telefono; }
        function 
getemail() { return $this->email; }
        function 
getcalle() { return $this->calle; }
        function 
getint() { return $this->int; }
        function 
getext() { return $this->ext; }
        function 
getcp() { return $this->cp; }
        function 
getcolonia() { return $this->colonia; }
        function 
getdelegacion() { return $this->delegacion; }
        function 
getestatus() { return $this->estatus; }
        
        
/* Inicializamos Set de la clase*/
        
        
function setcodigo($codigo) { $this->codigo $codigo;     }
        function 
setnombre($nombre) { $this->nombre $nombre;     }
        function 
settelefono($telefono) { $this->telefono $telefono;     }
        function 
setemail($email) { $this->email $email;     }
        function 
setcalle($calle) { $this->calle $calle;     }
        function 
setint($int) { $this->int $int;     }
        function 
setext($ext) { $this->ext $ext;     }
        function 
setcp($cp) { $this->cp $cp;     }
        function 
setcolonia($colonia) { $this->colonia $colonia;     }
        function 
setdelegacion($delegacion) { $this->delegacion $delegacion;     }
        function 
setestatus($estatus) { $this->estatus $estatus;     }
                                
    }
?>
Les agradezco por su tiempo, seguiré analizando el código para ver porque me manda el error, si tienen alguna idea es bienvenida mientras sigo estudiándolo, como les comenté anteriormente, aún no tengo sólidos conocimientos en POO.

Saludos
  #5 (permalink)  
Antiguo 03/06/2012, 01:51
Avatar de Uncontroled_Duck
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Málaga [Spain]
Mensajes: 806
Antigüedad: 12 años, 11 meses
Puntos: 261
Respuesta: Duda con error en PHP OO

Hola Middrel antes de seguir, deberías echarle un vistazo a lo básico sobre clases
http://php.net/manual/es/language.oop5.basic.php (hay muchísima información si buscas en Google)

Una vez arregles el error de mysql saldrá otro de métodos y variables no definidas, etc...

Las clases no corren como el código simple de php. Estas tienen que ser instanciadas (llamadas) para poder usar sus funciones. Al igual que las funciones que hay en el interior de las mismas. Para que hagan su trabajo, debes ser invocadas (llamadas).

Después el tema de las variables. La programación en PHP OO está basada en la encapsulación. Que en resumen si vas a utilizar variables externas a las clases, o entre ellas, primero tienes que introducirlas. (Esta es la clave de por que no funciona la query)

Esto no es fácil de explicar en pocas líneas, por eso te recomiendo que leas al respecto, e intentes entender como funciona. Y verás como empezarás a detectar rápidamente los errores claros que hay en esas clases.

Saludos,
__________________
Todos agradeceremos que pongas el código en su respectivo Highlight
  #6 (permalink)  
Antiguo 03/06/2012, 11:01
Avatar de Middrel  
Fecha de Ingreso: abril-2005
Mensajes: 835
Antigüedad: 19 años
Puntos: 27
Respuesta: Duda con error en PHP OO

Si, tienes razón Uncontroled_Duck. El problema que tengo en estos momentos es el siguiente, me ofrecen un trabajo donde necesitan a alguien que sepa Javascript, JQuery, PHP, PHP POO, HTML5 y CSS2/3.

Excepto PHP POO, todas las demás las manejo (no soy un experto pero las manejo en un nivel avanzado), me dejaron un examen para resolverlo en fin de semana (un examen largo y algo laborioso), y como se darán cuenta, en la parte de POO estoy algo atorado.

Así que desde el viernes que tuve la entrevista he estado teniendo un estudio express sobre POO, no me quiero dar por vencido en esto, pero si tengo muy en claro que aún no domino esta metodología. Fui claro con la empresa al decirle que manejo pero me comentaron que si lo resolvía pues que considerarían mi entrada a la empresa.

Más que nada es por eso que estoy como loco este fin de semana en POO.

Saludos a todos los que me apoyaron y dieron sus comentarios y puntos de vista!! :)
  #7 (permalink)  
Antiguo 03/06/2012, 14:00
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Duda con error en PHP OO

Debes también de tener en cuenta que PHP OO no es solo la sintaxis, también tienes que ver muchas otras cosas que son parte de lo esencial de POO, como lo son los principios de polimorfismo, la encapuslación, la abstracción, la mutación, etc. También ver los patrones de diseño, etc.

Son muchas cosas las que tienes que estudiar, y pues es un trabajo largo el que tienes que hacer para realmente entrar a POO.

Saludos.

Etiquetas: clase, class, php, 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 11:50.