Foros del Web » Programando para Internet » PHP »

Mis dos primeras clases: Registro () y Noticias (). Alguien puede calificarlas ?

Estas en el tema de Mis dos primeras clases: Registro () y Noticias (). Alguien puede calificarlas ? en el foro de PHP en Foros del Web. Bueno, viendo y considerando que el nivel de conocimientos en este tema en estos foros es superior al mio, y es de habla hispana, quisiera ...
  #1 (permalink)  
Antiguo 07/05/2004, 13:14
Avatar de Calisco  
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 13 años, 9 meses
Puntos: 4
Mis dos primeras clases: Registro () y Noticias (). Alguien puede calificarlas ?

Bueno, viendo y considerando que el nivel de conocimientos en este tema en estos foros es superior al mio, y es de habla hispana, quisiera pedirles que califiquen de alguna manera estas dos clases que hice recientemente. AHi van ...




Nombre clase: Class Registro ()
Archivo: class_registro.php
Instanciable: NO.
Herencia: NO.

Esta clase es superclase de las clases que se utilizan para manipular datos con una base de datos, tales como Noticia (), Miembro (), Enlaces (), etc
Esta es una clase NO instanciable; sirve para estructurar las subclases.

Propiedades:
$id: Es el identificador del registro. Es un numero unico para cada registro. Con este id se haran las relaciones de las tablas correspondientes.

Metodos:
Costructor Registro (): die (). Con esto evitamos la instanciacion de la clase

Conex ($db): Este metodo realiza la conexion con la base de datos respectuva.

Desconex (): Este metodo realiza la desconexion la base de datos.

id ($id): Asigna $id a la propiedad ID. Si sta vacio, entonces el metodo devuelve el valor de la propiedad id. Con este mecanismo un mismo metodo sirve para asignacion (setter) como para asignacion (getter).




Nombre clase: Class Noticia ()
Archivo: class_noticia.php
Instanciable: SI.
Herencia: de Superclase Registro ();

Esta clase parte de la herencia de la superclase Registro (), por consiguiente hereda todas las propiedades y metodos del mismo.

Un objeto Noticia (instancia de la clase Noticia) debe tener las siguientes caracteristicas:

Propiedades:
$id: Es el identificador de la noticia. Es un numero unico referente a cada noticia editada. Con este ID se haran las relaciones de las tablas correspondientes. Es el Indice de cada registro de la noticia.
$titulo: Titulo de la noticia :shock:.
$descripcion: Descripcion de la noticia :shock:.
$fecha: Fecha en la cual se posteo la noticia :shock:.
$imagen_URL: Es una imagen que se puede adosar en forma optativa a la noticia. Esta propiedad tiene el url absoluto de dicha imagen.
$link: Es un link alternativo y es optativo. Este depende si la noticia necesita tener o no tener un enlace al cual hacer referencia.
$poster_Id: Es el Id de quien postea la noticia. Supuestamente las noticias de la web de la rama serán posteadas por el grupo administrativo del sitio, conformado por miembros de la misma.

Metodos:
Constructor Noticia ($id): Con el constructor se crea el objeto y se asigna a $this->id el valor pasado en la funcion.

Set_Datos ($titulo, $decripcion, $fecha, $imagen_url, $poster_Id):En este método se setean las propiedades principales de la noticia. $id no se setea en este metodo, para esto se usa el metodo Id de la superclase Registro().

Los siguientes metodos setean o toman las propedades en forma individual
Set_Titulo ($titulo) - Set_Desc ($descripcion) - Set_Fecha ($fecha) - Set_PosterId ($poster_id).

Noticia_Get ():Este metodo sirve para 'chupar' los datos de la noticia de un registro de la tabla de la base de datos donde se alojan los datos respectivos de la noticia. El registro obtenido se hace comparando la propiedad del objeto $this->id con el campo id del de la tabla de datos.

Noticia_Add ():Con este metodo agregamos un registro nuevo a la tabla de noticias.

Noticia_Update ():Con este metodo actualizamos o modificamos un registro de la noticia en función de la propiedad $this->id del objeto en cuestion.

Noticia_Delete ():Borra de la tabla de noticias el registro que tiene el mismo valor que la propiedad $this->id.
__________________
| Cabeza De Raton |

Última edición por Calisco; 07/05/2004 a las 13:18
  #2 (permalink)  
Antiguo 07/05/2004, 13:21
Avatar de Calisco  
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 13 años, 9 meses
Puntos: 4
Bueno, la idea es reutilizar la superclase Registro () para usarla en otras subclases similares a la clase Noticia (). Por ejemplo, una clase Miembro () que se encargue de trabajar con datos de un grupo de miembros x.

Desde ya. muchas gracias al que tan solo haya leido lo escrito, que ya es bastante. Y bueno, si hay criticas, mucho mejor.

Saludos ...
__________________
| Cabeza De Raton |
  #3 (permalink)  
Antiguo 07/05/2004, 14:17
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
Hola,

¿Por que herencia? ¿Por que no composicion (o era agregacion)? Es decir, que Noticia tiene una propiedad que es un objeto Registro. En plan:
Código PHP:
class Noticia {
var 
$reg;

function 
Noticia() {
  
$reg=new Registro();
}

Mira en www.phppatterns.com los Data Access Objects (DAO).

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #4 (permalink)  
Antiguo 07/05/2004, 14:23
Avatar de Calisco  
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 13 años, 9 meses
Puntos: 4
No, esa no es la idea.
En realidad, escribi mal el codigo.

la clase Noticia () se hereda de la clase Registro ()

el codigo seria ...

Código PHP:
class Noticia extends Registro ()
{

__________________
| Cabeza De Raton |

Última edición por Calisco; 07/05/2004 a las 14:26
  #5 (permalink)  
Antiguo 09/05/2004, 18:10
Avatar de Calisco  
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 13 años, 9 meses
Puntos: 4
...
__________________
| Cabeza De Raton |
  #6 (permalink)  
Antiguo 11/05/2004, 13:50
 
Fecha de Ingreso: septiembre-2001
Ubicación: Monterrey
Mensajes: 663
Antigüedad: 16 años, 2 meses
Puntos: 6
Bueno me tome la molestia de revivir este mensaje, ahorita que contaba con un poco de tiempo.
Bien la problematica aqui es que hay muy poca informacion como para decirte que es lo mejor que puedes hacer para abordar tu problema calisco.
Pero suponiendo que los usuarios del area de noticias son administradores y pueden hacer cambio sobre ellas. supongo para inciiar el analisis que debes de tener una estructura logica similar a los siguiente qu epresenta la imagen En donde podemos ver que un usuario administrador del sistema puede manejar una o mas noticias, la estructura de los usuarios no la pongo explicitamente por que no se que campos requieres.
Ahora tu estas usando herencia para resolver el problema, pero yo te sugeriria que usaras un data mapper que te permite mantener comunicacion entre objetos y tu base de datos, la ventaja principal del mapper es que separa tu logica de como seran almacenados los datos en tu BD. Ademas de que gestiona todas las operaciones de busqueda y cambios en la base de datos. La estructura del mapper para tu caso en particular lo podemos ver en el siguiente diagrama. La parte que describe el mapper esta resaltado con colores. Como puedes ver el mapper hace uso de un objeto Noticia y tambien como resultado de sus operaciones de busqueda te devuelve una instancia de noticias y como puedes apreciar el mapper sirve de intermediario entre la base de datos y tu objeto noticias.
ahora si quieres hacer algo mas general tabien describo en el diagrama que puedes hacer una interface que sea implmentada para cada mapper que necesites como en el caso de las ligas que comentaste en un mensaje anterior.
El cargado tambien de los mapper puedes hacerlo mediante el patron FactoryMethod con el cual tu decidiras que mapper requieres en que momento. Y en mi conceptualizacion particular agrego un Iterator que mantiene una referencia de las instancias de Noticias. esto devido a que el mapper puede devolver un arreglo de instancias de noticias por lo cual un iterador me facilita el recorrido de dicho arreglo.
Ahora como modo de ejemplo te dejo la implementacion del mapper con codigo y de la clase noticias, para que los estudies. Los elementos que en el diagrama estan en blanco son opcionales y su estudio e implmentacion lo dejo a tu criterio.
  #7 (permalink)  
Antiguo 11/05/2004, 13:58
 
Fecha de Ingreso: septiembre-2001
Ubicación: Monterrey
Mensajes: 663
Antigüedad: 16 años, 2 meses
Puntos: 6
Clase Noticias:
Código PHP:
class Noticias{
    
        var 
ArrayPropiedades null;
    
        function 
Noticias$objDatos null){
        
            if( 
$objDatos !== null && is_array$objDatos ) ){
            
                foreach( 
$objDatos as $k $v ){
                
                    
$this->ArrayPropiedades[$k] = $v;
                
                }
            
            }
            return;
        
        }
        
        function 
obtId(){
        
            switch( 
func_num_args()){
            
                case 
0:
                        return 
$this->ArrayPropiedades['id_noticia'];
                        break;
                case 
1:
                        
$this->ArrayPropiedades['id_noticia']= func_get_arg(0);
                        break;
            
            }
        
        }
        
        function 
obtUsuarioId(){
        
            switch( 
func_num_args()){
            
                case 
0:
                        return 
$this->ArrayPropiedades['id_usuario'];
                        break;
                case 
1:
                        
$this->ArrayPropiedades['id_usuario']= func_get_arg(0);
                        break;
            
            }
        
        }
        
        function 
obtTitulo(){
        
            switch( 
func_num_args()){
            
                case 
0:
                        return 
$this->ArrayPropiedades['titulo'];
                        break;
                case 
1:
                        
$this->ArrayPropiedades['titulo']= func_get_arg(0);
                        break;
            
            }
        
        }
        
        function 
obtDescripcion(){
        
            switch( 
func_num_args()){
            
                case 
0:
                        return 
$this->ArrayPropiedades['descripcion'];
                        break;
                case 
1:
                        
$this->ArrayPropiedades['descripcion']= func_get_arg(0);
                        break;
            
            }
        
        }
        
        function 
obtFecha(){
        
            switch( 
func_num_args()){
            
                case 
0:
                        return 
$this->ArrayPropiedades['fecha'];
                        break;
                case 
1:
                        
$this->ArrayPropiedades['fecha']= func_get_arg(0);
                        break;
            
            }
        
        }
        
        function 
obtImagen(){
        
            switch( 
func_num_args()){
            
                case 
0:
                        return 
$this->ArrayPropiedades['imagen'];
                        break;
                case 
1:
                        
$this->ArrayPropiedades['imagen']= func_get_arg(0);
                        break;
            
            }
        
        }
        
        function 
obtLink(){
        
            switch( 
func_num_args()){
            
                case 
0:
                        return 
$this->ArrayPropiedades['link'];
                        break;
                case 
1:
                        
$this->ArrayPropiedades['link']= func_get_arg(0);
                        break;
            
            }
        
        }
    
    } 
Clase NotciasMapper:
Código PHP:
class NoticiaMapper{
    
        var 
$_bdcon null;
        
        var 
$_arrayNoticias null;
    
        function 
NoticiaMapper(){
        
            
$this->_bdcon DB::connect($dsn);
            if( 
DB::isError($this->_bdcon) )
            {
                die( 
$this->_bdcon->getMessage( ) );
            }
        
        }
        
        function 
obtListaNoticias(){
        
            
$sql 'SELECT * FROM noticias';
            
$sqlResult $this->_bdcon->query($sql);
            
            if( 
$this->_bdcon->isError($sqlResult)){
            
                die(
$sqlResult->getMessage());
            
            }
            
            if( 
$sqlResult->numRows() > 0){
            
                while( 
$registro $sqlResult->fetchRow(DB_FETCHMODE_ASSOC) ){
                
                    
$this->_arrayNoticias[ ] = &new Noticias$registro );
                
                }
                
                return 
$this->_arrayNoticias;
            
            }
            
            return 
false;
        
        }
        
        function 
obtNoticiaPorId$id ){
        
            
$strSql 'SELECT * FROM noticias WHERE id_noticia = %d';
            
$sql sprintf$strSql, (int)$id );
            
$this->_bdcon->query($sql);
            
            if( 
$this->_bdcon->isError($sqlResult)){
            
                die(
$sqlResult->getMessage());
            
            }
            
            if( 
$sqlResult->numRows() > 0){
            
                while( 
$registro $sqlResult->fetchRow(DB_FETCHMODE_ASSOC) ){
                
                    
$this->_arrayNoticias[ ] = &new Noticias$registro );
                
                }
                
                return 
$this->_arrayNoticias;
            
            }
            
            return 
false;
        
        }
        
        function 
obtNoticiaPorFecha$fecha ){
        
            
$strSql 'SELECT * FROM noticias WHERE fecha = %s';
            
$sql sprintf$strSql$fecha );
            
$this->_bdcon->query($sql);
            
            if( 
$this->_bdcon->isError($sqlResult)){
            
                die(
$sqlResult->getMessage());
            
            }
            
            if( 
$sqlResult->numRows() > 0){
            
                while( 
$registro $sqlResult->fetchRow(DB_FETCHMODE_ASSOC) ){
                
                    
$this->_arrayNoticias[ ] = &new Noticias$registro );
                
                }
                
                return 
$this->_arrayNoticias;
            
            }
            
            return 
false;
        
        }
        
        function 
agregar( &$noticia ){
        
            
$strSql "INSERT INTO noticias VALUES(%d,%d,'%s')";
            
$propObjeto = array(    
                                    
$noticia->obtTitulo(),
                                    
$noticia->obtDescripcion(),
                                    
$noticia->obtFecha(),
                                    
$noticia->obtImagen(),
                                    
$noticia->obtLink()
                                );
            
$sql sprintf(        
                                
$sql,
                                
'',
                                
$noticia->obtUsuarioId(),
                                
implode(',',$propObjeto)
                          );
                                 
            
$this->_bdcon->query($sql);
            if( 
$this->_bdcon->isError($sqlResult)){
            
                die(
$sqlResult->getMessage());
            
            }
            
            if(
$this->_bdcon->affectedRows()){
            
                return 
true;
            
            }else{
            
                return 
false;
            
            }
        }
        
        function 
actualizar( &$noticia ){
        
            
$strSql "UPDATE noticias SET id_usuarios = %d,
                                            titulo = '%s',
                                            descripcion = '%s',
                                            fecha = '%s',
                                            imagen = '%s',
                                            link = '%s'"
;
    
            
$sql sprintf(        
                                
$sql,
                                
$noticia->obtUsuarioId(),
                                
$noticia->obtTitulo(),
                                
$noticia->obtDescripcion(),
                                
$noticia->obtFecha(),
                                
$noticia->obtImagen(),
                                
$noticia->obtLink(),
                          );
                                 
            
$this->_bdcon->query($sql);
            if( 
$this->_bdcon->isError($sqlResult)){
            
                die(
$sqlResult->getMessage());
            
            }
            
            if(
$this->_bdcon->affectedRows()){
            
                return 
true;
            
            }else{
            
                return 
false;
            
            }
        }
        
        function 
actualizar( &$noticia ){
        
            
$strSql "DELETE FROM noticias WHERE id_noticia = %d";
    
            
$sql sprintf(        
                                
$sql,
                                
$noticia->obtId(),
                          );
                                 
            
$this->_bdcon->query($sql);
            if( 
$this->_bdcon->isError($sqlResult)){
            
                die(
$sqlResult->getMessage());
            
            }
            
            if(
$this->_bdcon->affectedRows()){
            
                return 
true;
            
            }else{
            
                return 
false;
            
            }
        }
    
    } 
Para la implementacion del la clase NotciasMapper hago uso de una clase de abstracion para acceso a base de datos que viene en las pear y cuya documentacion puede ver en http://pear.php.net/manual/en/packag...ge.database.db pero puedes adecuar la clase para usar alguna otra clase de abstraccion. Las clases no estan documentadas por que las acabo de hacer hace un momento. Pero no creo que esten muy complejas.
Por ciertos los diagrmas esta hecho con la version free del poseidon. Por si notan algunos dibujos en el fondo de las imagenes.
Bien espero que esto te sriva de ayuda y a los mejor se complementa con la opinion de los demas foreros que andan rondando por aqui.. Ya que esto que te comento es solo una perspectiva a lo mejor puedes haber mejores opciones o el uso de otros patrones como los patrones table data gateway , row data gateway , etc...
Recuerda probarlas clases estan escritas al vuelo.

Última edición por Herminio Heredia San; 11/05/2004 a las 16:03
  #8 (permalink)  
Antiguo 11/05/2004, 14:21
 
Fecha de Ingreso: septiembre-2001
Ubicación: Monterrey
Mensajes: 663
Antigüedad: 16 años, 2 meses
Puntos: 6
Ejemplo de uso sencillo.
Código PHP:
$mp = &new NoticiaMapper();
    
$noticias $mp->obtListaNoticias();
    foreach(
$noticias as $noticia ){
    
        echo 
$noticia->obtId()."<br>\n";
        echo 
$noticia->obtTitulo()."<br>\n";
        echo 
$noticia->obtDescripcion()."<br>\n";
        echo 
$noticia->obtFecha()."<br>\n";
        echo 
$noticia->obtImagen()."<br>\n";
        echo 
$noticia->obtLiga()."<br>\n";
    
    } 
Uso sencillo agregar noticia:
Código PHP:
$datos = array( 'id_noticia'=>'',
                    
'id_usuario'=>'1',
                    
'titulo'=>'xxx',
                    
'descripcion'=>'yyyy',
                    
'fecha'=>'2003-02-01',
                    
'imagen'=>'algo.jpg',
                    
'link'=>'http://www.algo.com'
                    
);
                    
    
$noticia =& new Noticias($datos);
    
$mp = &new NoticiaMapper();
    if(
$mp->agregar($noticia)){
    
        exit(
'La notcia se agrego');    
    
    } 

Última edición por Herminio Heredia San; 11/05/2004 a las 14:44
  #9 (permalink)  
Antiguo 11/05/2004, 14:28
Avatar de Calisco  
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 13 años, 9 meses
Puntos: 4
Mira Viejo, no tengo palabras agradecerte por el timepo que te tomaste para esto.

Lo voy a estudiar hasta saberlo mejor que mi pito, y posteo la respuesta.

Gracias de nuevo.
__________________
| Cabeza De Raton |
  #10 (permalink)  
Antiguo 11/05/2004, 14:34
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 15 años
Puntos: 1
Herminio ??

Herminio que case es ese que usas para realizar el diseño de tus clases? Si tienes un link o un sitio para descargarlo decimelo pues ando buscando uno ya que el Visio y el Rational Rose me son demasiado complicados y además ocupan mucho espacio, sobre todo el Rational Rose.

Salu2
__________________
Ing. Reynier Pérez Mira
  #11 (permalink)  
Antiguo 11/05/2004, 14:48
 
Fecha de Ingreso: septiembre-2001
Ubicación: Monterrey
Mensajes: 663
Antigüedad: 16 años, 2 meses
Puntos: 6
Hola Reynier, el diagramador se llama Posiedon y estoy usando la version Community Edition que tiene todo lo necesario para hacer los diagramas lo unico que no hace es convertir los modelos en codigo. Par eso necesitas la version professional si no mal recuerdo.
Lo puedes descargar y ver sus caracteristicas en http://www.gentleware.com/
  #12 (permalink)  
Antiguo 11/05/2004, 14:50
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
http://www.gentleware.com/
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #13 (permalink)  
Antiguo 11/05/2004, 15:00
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 15 años
Puntos: 1
Gracias

Gracias a ambos lo bajaré y probaré.
Salu2
__________________
Ing. Reynier Pérez Mira
  #14 (permalink)  
Antiguo 11/05/2004, 15:28
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 16 años, 1 mes
Puntos: 68
Herminio, sinceramente, no se puede esperar menos de ti. Excelente explicación y código, tan solo comentarte que a simple vista, parece haber un error en el constructor de NoticiaMapper y que de hecho, según creo yo, esta clase NoticiaMapper es una especie de mezcla entre un DAO y un Mapper, cierto ? de todas maneras, es una excelente base para comenzar a desarrollar una capa para la abstracción de los objetos y la base de datos, de uso general.

saludos !
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #15 (permalink)  
Antiguo 11/05/2004, 16:05
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 15 años
Puntos: 1
Chicos me da errores

Chicos me he bajado la instalacion Professional pero me da errores a la hora de iniciar la aplicación. MI SO es Win2003, me dijo que le instalará la máquina virtual de Java pero como mi SO es 2003, entonces pense que la de XP me podia servir y se la cañoné que hago ahora ?

SAlu2
__________________
Ing. Reynier Pérez Mira
  #16 (permalink)  
Antiguo 11/05/2004, 16:12
 
Fecha de Ingreso: septiembre-2001
Ubicación: Monterrey
Mensajes: 663
Antigüedad: 16 años, 2 meses
Puntos: 6
Gracias pablo, por tus comentarios y tambien por tu aguda vista, por que es cierto habia un error en el constructor ademas de estar obviando el uso de la variable $dsn, pero esa la dejo de tarea.
Y tienes razon el uso de DAO esta implicito en el mapper y podriamos considerarlo como una mezcla. a un que en realidad todo el conjunto es una mezcla de patrones.
  #17 (permalink)  
Antiguo 11/05/2004, 22:37
Avatar de Calisco  
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 13 años, 9 meses
Puntos: 4
Correcciones de los scripts.

Bueno, la verdad que todo esto me esta dando vuelta la cabeza. Me parece que es demasiado para mi. Igualmente, estuve depurando un poco el codigo e hice correcciones de sintaxis.
Aca los pongo por si alguien quiere reutilizar este codigo:

Clase Noticias
Código PHP:
<?php
class Noticias{
    
        var 
$ArrayPropiedades null;

        function 
Noticias$objDatos null){

            if( 
$objDatos !== null && is_array$objDatos ) ){

                foreach( 
$objDatos as $k => $v ){

                    
$this->ArrayPropiedades[$k] = $v;

                }

            }
            return;

        }

        function 
obtId(){

            switch( 
func_num_args()){

                case 
0:
                        return 
$this->ArrayPropiedades['id_noticia'];
                        break;
                case 
1:
                        
$this->ArrayPropiedades['id_noticia']= func_get_arg(0);
                        break;

            }

        }

        function 
obtUsuarioId(){

            switch( 
func_num_args()){

                case 
0:
                        return 
$this->ArrayPropiedades['id_usuario'];
                        break;
                case 
1:
                        
$this->ArrayPropiedades['id_usuario']= func_get_arg(0);
                        break;

            }

        }

        function 
obtTitulo(){

            switch( 
func_num_args()){

                case 
0:
                        return 
$this->ArrayPropiedades['titulo'];
                        break;
                case 
1:
                        
$this->ArrayPropiedades['titulo']= func_get_arg(0);
                        break;

            }

        }

        function 
obtDescripcion(){

            switch( 
func_num_args()){

                case 
0:
                        return 
$this->ArrayPropiedades['descripcion'];
                        break;
                case 
1:
                        
$this->ArrayPropiedades['descripcion']= func_get_arg(0);
                        break;

            }

        }

        function 
obtFecha(){

            switch( 
func_num_args()){

                case 
0:
                        return 
$this->ArrayPropiedades['fecha'];
                        break;
                case 
1:
                        
$this->ArrayPropiedades['fecha']= func_get_arg(0);
                        break;

            }

        }

        function 
obtImagen(){

            switch( 
func_num_args()){

                case 
0:
                        return 
$this->ArrayPropiedades['imagen'];
                        break;
                case 
1:
                        
$this->ArrayPropiedades['imagen']= func_get_arg(0);
                        break;

            }

        }

        function 
obtLink(){

            switch( 
func_num_args()){

                case 
0:
                        return 
$this->ArrayPropiedades['link'];
                        break;
                case 
1:
                        
$this->ArrayPropiedades['link']= func_get_arg(0);
                        break;

            }

        }
    
    }
?>

Clase Mapper
Código PHP:
<?php
class NoticiaMapper{

        var 
$_bdcon null;

        var 
$_arrayNoticias null;

        function 
NoticiaMapper(){

            
$this->_bdcon DB::connect($dsn);
            if( 
DB::isError($this->_bdcon) )
            {
                die( 
$this->_bdcon->getMessage( ) );
            }

        }

        function 
obtListaNoticias(){

            
$sql 'SELECT * FROM noticias';
            
$sqlResult $this->_bdcon->query($sql);

            if( 
$this->_bdcon->isError($sqlResult)){

                die(
$sqlResult->getMessage());

            }

            if( 
$sqlResult->numRows() > 0){

                while( 
$registro $sqlResult->fetchRow(DB_FETCHMODE_ASSOC) ){

                    
$this->_arrayNoticias[ ] = &new Noticias$registro );

                }

                return 
$this->_arrayNoticias;

            }

            return 
false;

        }

        function 
obtNoticiaPorId$id ){

            
$strSql 'SELECT * FROM noticias WHERE id_noticia = %d';
            
$sql sprintf$strSql, (int)$id );
            
$this->_bdcon->query($sql);

            if( 
$this->_bdcon->isError($sqlResult)){

                die(
$sqlResult->getMessage());

            }

            if( 
$sqlResult->numRows() > 0){

                while( 
$registro $sqlResult->fetchRow(DB_FETCHMODE_ASSOC) ){

                    
$this->_arrayNoticias[ ] = &new Noticias$registro );

                }

                return 
$this->_arrayNoticias;

            }

            return 
false;

        }

        function 
obtNoticiaPorFecha$fecha ){

            
$strSql 'SELECT * FROM noticias WHERE fecha = %s';
            
$sql sprintf$strSql$fecha );
            
$this->_bdcon->query($sql);

            if( 
$this->_bdcon->isError($sqlResult)){

                die(
$sqlResult->getMessage());

            }

            if( 
$sqlResult->numRows() > 0){

                while( 
$registro $sqlResult->fetchRow(DB_FETCHMODE_ASSOC) ){

                    
$this->_arrayNoticias[ ] = &new Noticias$registro );

                }

                return 
$this->_arrayNoticias;

            }

            return 
false;

        }

        function 
agregar( &$noticia ){

            
$strSql "INSERT INTO noticias VALUES(%d,%d,'%s')";
            
$propObjeto = array(
                                    
$noticia->obtTitulo(),
                                    
$noticia->obtDescripcion(),
                                    
$noticia->obtFecha(),
                                    
$noticia->obtImagen(),
                                    
$noticia->obtLink()
                                );
            
$sql sprintf(
                                
$sql,
                                
'',
                                
$noticia->obtUsuarioId(),
                                
implode(',',$propObjeto)
                          );

            
$this->_bdcon->query($sql);
            if( 
$this->_bdcon->isError($sqlResult)){

                die(
$sqlResult->getMessage());

            }

            if(
$this->_bdcon->affectedRows()){

                return 
true;

            }else{

                return 
false;

            }
        }

        function 
actualizar( &$noticia ){

            
$strSql "UPDATE noticias SET id_usuarios = %d,
                                            titulo = '%s',
                                            descripcion = '%s',
                                            fecha = '%s',
                                            imagen = '%s',
                                            link = '%s'"
;

            
$sql sprintf(
                                
$sql,
                                
$noticia->obtUsuarioId(),
                                
$noticia->obtTitulo(),
                                
$noticia->obtDescripcion(),
                                
$noticia->obtFecha(),
                                
$noticia->obtImagen(),
                                
$noticia->obtLink()
                          );

            
$this->_bdcon->query($sql);
            if( 
$this->_bdcon->isError($sqlResult)){

                die(
$sqlResult->getMessage());

            }

            if(
$this->_bdcon->affectedRows()){

                return 
true;

            }else{

                return 
false;

            }
        }

        function 
borrar(&$noticia ){

            
$strSql "DELETE FROM noticias WHERE id_noticia = %d";

            
$sql sprintf(
                                
$sql,
                                
$noticia->obtId()
                          );

            
$this->_bdcon->query($sql);
            if( 
$this->_bdcon->isError($sqlResult)){

                die(
$sqlResult->getMessage());

            }

            if(
$this->_bdcon->affectedRows()){

                return 
true;

            }else{

                return 
false;

            }
        }

    }
?>
Estoy en la prehistoria del conocimiento en la POO. Que es pear DB ?
Acabo de bajarme el archivo de http://pear.php.net/
Esta es la ultima version de DB: 1.6.4
http://pear.php.net/get/DB

Saludos ...
__________________
| Cabeza De Raton |

Última edición por Calisco; 11/05/2004 a las 23:07
  #18 (permalink)  
Antiguo 11/05/2004, 23:26
Avatar de Calisco  
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 13 años, 9 meses
Puntos: 4
Veo que DB de pear es una clase para la gestion de una base de datos.

Estuve viendo el constructor de la clase NoticiaMapper, y le falta un parametro ?
Código PHP:
function NoticiaMapper(){

            
$this->_bdcon DB::connect($dsn);
            if( 
DB::isError($this->_bdcon) )
            {
                die( 
$this->_bdcon->getMessage( ) );
            }

        } 

El metodo connect de la clase DB lleva los siguientes parametros:
Código PHP:
function &connect($dsn$options = array()) 
En el constructor creo que tengo que especificarle la DSN (Data Source Name) que dentro del metodo es $dsn
Código PHP:
$this->_bdcon DB::connect($dsn); 
la $dsn se configura de esta manera
$dsn = 'mysql://user:[email protected]/database'
http://pear.php.net/manual/en/package.database.db.intro-connect.php

entonces ...

EL constructor debe tener un parametro de entrada $dsn,
quedaria asi:
Código PHP:
function NoticiaMapper($dsn
y cuando instancio un objeto deberia ser ...
Código PHP:
$dsn 'mysql://user:[email protected]/database'
$mp = &new NoticiaMapper($dsn); 
__________________
| Cabeza De Raton |
  #19 (permalink)  
Antiguo 11/05/2004, 23:30
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 15 años
Puntos: 1
Chicos

Estoy desarrollando una clase para MySQL que en un futuro la pensaría extender a MS SQL y a PostgreeSQL. Si ya se que me dirán que existen muchas y muy buenas pero trataré de integrar la mayor cantidad de métodos posibles. Así que necesito de su ayuda para que me ayuden en la confección de las clases, es decir, que les haría falta optimizar a los usuarios a la hora de trabajar con MySQL. La desarrollo en un principio para el sitio personal mío que estoy programando y para un Sistema que comenté hace unos días en un POST pero cuando la concluya la pongo pública para que todo el que quiera usarla pueda hacerla. Ese es el funcionamiento de una comunidad de programadores como los que hoy se hallan en FDW ¿no?. Bueno dentro de poco publico otro POST con el diseño de las clases y los métodos de las mismas. Por lo pronto díganme que quieren automatizar.

Salu2

PD: Solo estoy en 2do año de Ing. Informática por lo que pueden surgirme dudas así que bueno, los seguiré chivando a menudo por acá por FDW.
__________________
Ing. Reynier Pérez Mira
  #20 (permalink)  
Antiguo 12/05/2004, 00:08
Avatar de Calisco  
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 13 años, 9 meses
Puntos: 4
Que bueno.

Bueno, haciendo la correccion que mencione anteriormente, los scripts andan de 10. Ahora tengo que tratar de entenderlos; pero me voy a dormir, si no mañana no me levanta ninguna instancia de la clase despertador.
__________________
| Cabeza De Raton |
  #21 (permalink)  
Antiguo 01/06/2004, 21:30
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
ufff... Herminio... qué gran explicación... de hecho nos da un acercamiento muy bueno (y sobretodo claro) a los que recién estamos empezando en este tema. Pues nada, muchísimas gracias.

Saludos

PD: Y Reynier... si sigues teniendo problemas con el Poseidón postéalos en un tema aparte... no contamines este precioso post xD.
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 00:02.