Comunidad de diseño web y desarrollo en internet online

php orientado a objetos

Citar            
MensajeEscrito el 16 Ago 2006 01:51 am
necesito realizar una clase que realice todas las operaciones relacionadas con Bases de datos, el problema es que hasta ahora he trabajado siempre de forma estructurada y aunque he leido algunos manuales de php OO han sido demasiado basicos y no tengo muy claro de como pasar la conexion a base de datos y todo eso a OO en una sola clase, además me piden que la clase sea generica y que pueda conectarse con cualquier base de datos y eso me lo pone un tanto más complicado.

Esto es para un proyecto en mi curso, pero lo que nos explicaron de php OO fue algo muy básico y no me quedo muy claro, si ustedes pueden ayudarme se los agradecere en el alma

Por Takashi

Claber

105 de clabLevel



Genero:Masculino  

Caracas - Venezuela

firefox
Citar            
MensajeEscrito el 16 Ago 2006 02:49 am
He practicado algo, y tengo la clase hecha
me gustaria que la viesen a ver que tan mal la hice

Código :

<?php 
   class DB{
   var $link;
   var $result;
      function conectar($host,$user,$pass, $bd){
         if (!($this->link=mysql_connect($host,$user,$pass))){
            echo "Error conectando a la base de datos.";
            exit();
         }
         if (!mysql_select_db($bd,$this->link)){
            echo "Error seleccionando la base de datos.";
            exit();
         }
         return $this->link;
      }
      function sentencias($sql){
         $this->result=mysql_query($sql, $this->link);
         return $this->result;
      }
      function row($row){
         $this->result=mysql_fetch_array($row);
         return $this->result;
      }
      function desconectar($bd){
         mysql_close($bd);
      }
   }
   
   $bd= new DB();
   $conectar= $bd->conectar("localhost","root","","php_aniotaku");
   $sql= "select * from noticias";
   $result= $bd->sentencias($sql);
   while ($row= $bd->row($result)){
      echo "$row[titulo]<br>";
   }
   $bd->desconectar($conectar);
?>


La base de datos realmente existe y reliza la consulta correctamente pero aún asi me gustaria que rivisen la sintaxis a ver si me pele en algo o hice algo que no debia, es que se puede decir que aprendi eso en 5 minutos asi que....

Por Takashi

Claber

105 de clabLevel



Genero:Masculino  

Caracas - Venezuela

firefox
Citar            
MensajeEscrito el 16 Ago 2006 03:15 am

Takashi escribió:

además me piden que la clase sea generica y que pueda conectarse con cualquier base de datos


Me imagino que te refieres a cualquier gestor de Base de Datos, ya sea MySQL, PostGre, etc. , pues si existe algo para eso, creo que es un objeto de php ya hecho, pero no recuerdo el nombre, eso lo investigaron unos amigos que teniamos una exposicion en la univ sobre eso, pero no recuerdo en verdad.

Con respecto a tu codigo, te doy unas ideas y tu las mejoras:

Realiza la conexion en el metodo sentencias, que es cuando realmente la necesitas, recuerda que debes mantener abierta la conexion a MySQL el menor tiempo posible, y cierra la conexion cuando ejecutes la sentencias, eliminando el metodo desconectar

Código :

function sentencias($sql){
        // realiza aqui la invocacion a conectar, algo asi:
        if  ($this->conectar($this->host, $this->user, $this->pass)){
               $this->result=mysql_query($sql, $this->link);
               @mysql_close(); 
                return $this->result;
        } 
        return false;
     }

Si no le pasas argumentos a mysql_close, el cierra por defecto la ultima conexion que se hizo.


Para el metodo row, yo tengo algo parecido, pero lo hago asi:

Código :

function getData ( $resource = NULL){
      if ( !is_resource(  $resource  ) ){
         $Data = $resource;
      } else{
            $Data = array( );
            while ( $row = @mysql_fetch_array( $resource , MYSQL_ASSOC ) ){
               array_push( $Data , $row );
            }
      }
      return $Data;
   }


saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 16 Ago 2006 03:45 am
no es que yo sea muy bueno en PHP no, pero vean esto

Por Prozac

SWAT Team

1546 de clabLevel

1 tutorial

Genero:Masculino   SWAT

donde se regresa el viento

firefox
Citar            
MensajeEscrito el 16 Ago 2006 03:49 am
eso era lo que yo decia, thanks Prozac.

saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 16 Ago 2006 04:54 am

Prozac escribió:

no es que yo sea muy bueno en PHP no, pero vean esto

Muchas gracias, solo que de ingles se lo mismo que de biologia marina, o sea, nada.

Por otro lado Muchas Gracias por los comentarios, voy a tratar de mejorar eso.
Una pregunta Maikel, como dije antes de orientado a objetos pues no sepo casi nada y de php todavia me falta mucho, podrias explicarme mejor el metodo getData?? no entiendo muy bien que es lo que hace la funcion is_resource y tampoco MYSQL_ASSOC. Y porque colocas el $resource = NULL al momento de recibir el parametro???

Del resto me agrada las ideas que me diste, ahora solo le preguntare a mi profesor si puedo colocar lo de la conexion como me sugeristes ya que fue una sugerencia del proyecto que se colocase el metodo de cerrar la conexion, si me dice que puedo hacerlo asi (que me gusta mas) pues asi lo hare, nuevamente muchas gracias jejeje :P

PDT: Creen que me haga falta algun metodo?? realmente no creo pero no sepo si haga falta alguno

Por Takashi

Claber

105 de clabLevel



Genero:Masculino  

Caracas - Venezuela

firefox
Citar            
MensajeEscrito el 16 Ago 2006 06:30 am

Takashi escribió:

podrias explicarme mejor el metodo getData?? no entiendo muy bien que es lo que hace la funcion is_resource y tampoco MYSQL_ASSOC. Y porque colocas el $resource = NULL al momento de recibir el parametro???


mmm a ver, lo que hago en getData es colocar el resultado de la consulta en un arreglo en el caso de que sea un recordset (resultado de tipico select), sino es un select, es decir, que sea un insert, update o delete, no devuelven un resource(RecordSet) sino un entero que indica si se llevo con exito o no la operacion. Ahora lo que yo hago es:

Código :

// pregunto  no es un resource?, o bien no  es un RecordSet?
if ( !is_resource(  $resource  ) ){

         $Data = $resource; // retornara su valor como llego

 } else{ // si es un resource, o es lo mismo es un recordset
//entonces colocalo en un arreglo

            $Data = array( );

            while ( $row = @mysql_fetch_array( $resource , MYSQL_ASSOC ) ){

               array_push( $Data , $row );

            }

      }


MySQL_ASSOC, es sencillamente para que use los nombre de los campos y/o alias que colocaste en la consulta, ejemplo:
para una consulta del estilo:

Código :

SELECT Campo1, Campo2 FROM Tabla


getData cuando entra al else, porque es un Recordset, retornará algo como esto:

Código :

array(
Data[0] => array(
          ['Campo1'] = "Valor 1",
          ['Campo2'] = "Un valor mas 1",
         ),
Data[1] => array(
          ['Campo1'] = "valor 2",
          ['Campo2'] = "Un valor mas 2",
          ),
Data[N] => array(
          ['Campo1'] = "valor N",
          ['Campo2'] = "Un valor mas N",
           )
);


pues sino le colocas el MySQL_ASSOC al mysql_fetch_array, te dara esto:
por ejemplo para Data[0]

Código :

Data[0] => array(
          [0]= >"Valor 1",
          ['Campo1'] = "Valor 1",
          [1]= >"Un valor mas 1",
          ['Campo2'] = "Un valor mas 1"
         )


Takashi escribió:

Y porque colocas el $resource = NULL al momento de recibir el parametro???

emm bueno cuando construyes las clases para proyectos "grandes", se usan pruebas unitarias, que prueban las malas invocaciones a los metodos, es decir, alguien pudiera invocar getData sin parametros, y la aplicacion generará un error "fatal" que no deberia ocurrir, al inicializar el parametro con un valor (la razon del NULL) me evito que genere ese error.

Para que lo veas más claro, prueba esto:

Código :

function unaFuncion ( $param = "inicializado"){
       return $param;
}
echo unaFuncion(); // imprime inicializado
echo unaFuncion("modificado"); //imprime modificado
 


Takashi escribió:

fue una sugerencia del proyecto que se colocase el metodo de cerrar la conexion


bueeeeno, si te lo exigen hazlo, pero como digo no es necesario ni recomendado, pues la conexion solo debe permanecer abierta mientras se ejecutan las consultas, no mas de alli. Con ese metodo de cerrar la conexion, a cualquiera se le puede olvidar cerrar la conexion y no seria bueno.

Takashi escribió:

Creen que me haga falta algun metodo?? realmente no creo pero no sepo si haga falta alguno


mmm, bueno la razon del getData es para liberar la memoria de mysql en el caso de que sea un resource, yo tengo un segundo parametro en el metodo sentencias para indicar si se quiere o no liberar el resource, pues cuando es un insert, delete o update no puedes liberar el resultado, pues mysql no almacena eso en memoria. Por supuesto para liberar el resultado lo hago en otro metodo. Aunque como lo veo, lo puedes hacerlo en el mismo metodo sentencias despues de invocar a getData puedes liberar la memoria, pues en mi caso si tuve que hacerlo en otro metodo.

saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 16 Ago 2006 06:48 am
Ehhhh muuuchas Gracias...
Con todo esto ya estoy un paso mas cerca de completar esto

Por Takashi

Claber

105 de clabLevel



Genero:Masculino  

Caracas - Venezuela

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.