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

Clase Conexión

Estas en el tema de Clase Conexión en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas a tod@s, Aunque parezca extraño, mi experiencia con PHP no va ligada a mysql :) pero tampoco es unacosa que me preocupe ya que ...
  #1 (permalink)  
Antiguo 13/08/2005, 12:34
Avatar de MarioNunes  
Fecha de Ingreso: agosto-2005
Mensajes: 280
Antigüedad: 18 años, 8 meses
Puntos: 1
Clase Conexión

Buenas a tod@s,

Aunque parezca extraño, mi experiencia con PHP no va ligada a mysql :) pero tampoco es unacosa que me preocupe ya que en su día para realizar conexiones a Oracle cree una clase para dicho fin.

Utilizando la clase, tengo un método que siempre me devuelve un array bidimensional y tengo la aplicacion creada de esta manera, sin tener en cuenta el tipo de datos, no utilizo en el código de la app funciones concretas de una BD.

Ahora me gustaría poder hacer una clase con PHP para trabajar de la misma manera pero en mysql, de esta manera no tendría que realizar ningún cambio de código excepto la clasle de conexión, obviamente...

Los métodos principales en la clase que tengo para trabajar con oracle son:

Código PHP:
         function listar($sentencia)
             {
                  
                  
$stmt OCIParse($this->conexion$sentencia);
                  
OCIExecute($stmt);
         
$this->nrows=oci_fetch_all($stmt$results); 
         
$this->ncolumns=ocinumcols($stmt);
                 return 
$results;
                  
OCI_Free_statement($stmt);

             }
     function 
actualizar($sentencia)
        {
            
$stmt=OCIParse($this->conexion$sentencia);
         
OCIExecute($stmt);
        } 
Siempre que lanzo una consulta tipo:

"Select id,nombre from noticias";

lo que hago para poder imprimir noticias es:

Código PHP:
for($i=0;$i<$db->nrows;$i++)
{
      echo 
$resultado['nombre'][$i]."<br>";

Bueno, a ver si me podéis echar un cable.

Gracias y un saludo.
__________________
www.pensandoenred.com
  #2 (permalink)  
Antiguo 15/08/2005, 14:23
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Te recomiendo que veas como trabajan algunas capas de abstracción de BD que usan bajo los mismos nombres de métodos y los datos que devuelven várias BD.

Por ejemplo tienes la famosa:

ADOdb
http://adodb.sourceforge.net/
(la usan grandes aplicaciones CMS, Foros .. como PHP-Nuke, phpBB si mal no recuerdo .. etc)

Y otra más: ezSQL
http://php.justinvincent.com/home/ar...hp?articleId=2

Esta tiene un manejo particular del tema .. en lugar de tener métodos que hagan el "switch" entre unas funciones u otras según uses Mysql u otras BD .. simplementen tiene classes por separados (fisicamente en archivos.php) y es bajo una simple función o switch donde carga una u otra classe según trabajes, pues lo normal es que instancies una classe para trabajar con una Sola BD ... y si en el mismo script usas otra BD diferente, vuelves a instanciarlo para crear tu nueva conexión y usar los métodos que correspondan.

De hecho .. bueno ya dices tener hecha una aplicación que usa tus métodos .. pero podría cambiarte a alguno de estas classes de fama reconocida y uso extendido.

Un saludo,
  #3 (permalink)  
Antiguo 16/08/2005, 02:10
Avatar de MarioNunes  
Fecha de Ingreso: agosto-2005
Mensajes: 280
Antigüedad: 18 años, 8 meses
Puntos: 1
No me parece mala idea el utilizar una clase de este estilo para trabajar, obviamente es mejor de lo que estoy pensando, pero lo que necesito es una clase en mysql que devuelva los valores de la manera que he mencionado antes, para así poder reutilizar la aplicación y usarla con mysql sin necesidad de modificar todo el códiog de la apicación, eso sería un cambio drástico... aunque para futuros nuevos proyectos está bien.

Tengo que investigar sobre las funciones de mysql, para así poder realizar mi propia clase con los resultados que estoy buscando.

De todas formas, gracias a tu respuesta me has pasado un enlace del que puedo aprender. Gracias y un saludo.
__________________
www.pensandoenred.com
  #4 (permalink)  
Antiguo 17/08/2005, 02:43
Avatar de MarioNunes  
Fecha de Ingreso: agosto-2005
Mensajes: 280
Antigüedad: 18 años, 8 meses
Puntos: 1
Mi solución :)

Aunque agradezco la recomendación que me han podido ofrecer, he preferido utilizar una clase con el objetivo que estaba buscando.

Quedando el código de la siguiente manera.

conexion.class.php
Código PHP:
  class db_conexion
      
{
      var 
$conexion;
      var 
$nrows;

        function 
__construct($host,$user,$pass,$db)
                {
                  
$this->conexion mysql_connect($host$user$pass);
                 if (!
$this->conexion) {
                   die(
'Sin conexión : ' mysql_error());
                 }

                
$db_selected mysql_select_db($db$this->conexion);
                if (!
$db_selected) {
                   die (
'No se puede usar la base de datos seleccionada: ' mysql_error());
                }
              }
            
         function 
lista($sentencia)
             {
                
$arr = array();
                
$col=0;

                
$seleccion mysql_query($sentencia);
                if (!
$seleccion) {
                    die(
'Error en consulta: ' mysql_error());
                }
                
                if (
mysql_num_rows($seleccion) > 0)
                {
                    
$x=0;

                        while(
$row mysql_fetch_row($seleccion))
                        {
                            foreach(
$row as $i => $value) {
                                
$column mysql_field_name($seleccion,$i);
                                
$arr["$column"][$x]=$value;
                            }
                            
$x++;
                          }
                   }
                  
$this->nrows=$x;
                
mysql_free_result($seleccion);
                return 
$arr;
             }
        function 
actualiza($sentencia)
        {
                
$seleccion mysql_query($sentencia);
                if (!
$seleccion) {
                    die(
'Error en consulta: ' mysql_error());
                }
        }
              
       function 
__destruct()
       {
              
mysql_close($this->conexion);
       }
                   
               

Y para usar esta clase podríamos usar este ejemplo:

index.php

Código PHP:
require('conexion.class.php');

$db="prueba";
$user="root";
$pass="root";
$host="localhost";

$db=new db_conexion($host,$user,$pass,$db);

$sql="select Nombre from prueba";
$rs=$db->lista($sql);
$nrows=$db->nrows;
for(
$i=0$i<$nrows;$i++)
{
    echo 
$rs['Nombre'][$i]."<br>";

Bueno, espero que esto sirva de algo a alguien :) o por lo menos si veis que hago algo mal me lo indiqueis :).

Lo que hago es devolver siempre un array bidimensional.

Gracias a todos y un saludo.
__________________
www.pensandoenred.com
  #5 (permalink)  
Antiguo 17/08/2005, 06:33
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Sabes? .. la classe ezSQL que te mencioné hace eso mismo .. entrega resultados en forma de Array o de objeto (además es configurable como deseas obtener tus resultados) .. Normalmente todas lo hacen así.

http://justinvincent.com/home/docs/e...z_sql_help.htm

Claro .. los nombres de los métodos ni la forma de instanciar el objeto es exactamente igual a lo que el resto de tu código ya creado usará .. pero si puedes, hechale un vistazo a esa classe por qué de ahí podras ver incluso tal vez como optimizar tu própia classe o definitivamente usarla para próximos proyectos. Por mi parte la he usado bastante ... va bastante bien y hasta el mismo creador de dicha classe tiene un sistema de paginado bien interesante en base a su classe de capa de abstracción de BD.

PD: no me llevo comisión por mencionar estas classes xDD

Un saludo,
  #6 (permalink)  
Antiguo 17/08/2005, 09:19
Avatar de MarioNunes  
Fecha de Ingreso: agosto-2005
Mensajes: 280
Antigüedad: 18 años, 8 meses
Puntos: 1
Buenas Cluster,

Me ha venido muy bien ese enlace, pero lo que necesitaba para no tener que modificar nada era exacamente esto :)

4 cosas sin + :)

Y tengo muy en cuenta la url que me has facilitado para futuros proyectos.

Gracias por todo y un saludo.
__________________
www.pensandoenred.com
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 03:24.