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

[APORTE] Clase de Conexion a Base de Datos

Estas en el tema de [APORTE] Clase de Conexion a Base de Datos en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas quiero compartir con el foro una de las clases que he implementado para proveer acceso a base de datos, sucede que he estado construyendo ...
  #1 (permalink)  
Antiguo 01/08/2009, 14:40
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 18 años, 1 mes
Puntos: 8
[APORTE] Clase de Conexion a Base de Datos

Buenas

quiero compartir con el foro una de las clases que he implementado para proveer acceso a base de datos, sucede que he estado construyendo un mini framework .net bajo php5, lo que pretendo es facilitar el uso de php para programadores .net ademas de aprender mediante el proceso de elaboracion de un pequeño core que es muy similar al ADO.NET.

P.D: lo hago a modo de practica para aprender mejorar mis conocimientos sobre OOP y es que me exista ver los codigos que publican algunos miembros como Enrique y GatorV entre otros.


Saludos al foro.


Enjoy It!!!..

Código PHP:
<?php

/** 
*  Class to provide access to a database Mysql on a server.
*
* @package     
* @subpackage  
* @name          MySqlConnection
* @version    $Id:$ 
* @author      Jacksson Enrique Mosquera Rivas
*/

final class MySqlConnection implements IDbConnection
{
    
/******************************************************/
    /*                 Internal Member                    */
    /******************************************************/
    
private $ServerName;
    private 
$UserName;
    private 
$Password;
    private 
$Database;
    private 
$Connection;
    
    
/******************************************************/
    /*                 Construct                          */
    /******************************************************/
    
public function __construct($ServerName$UserName$Password$Database ) {
        
$this->ServerName $ServerName;
        
$this->UserName      $UserName;
        
$this->Password   $Password;
        
$this->Database   $Database;
    }
    
    
/******************************************************/
    /*                    Property                              */
    /******************************************************/
    
public function get_ConnectionString () {
        throw new 
Exception('Function not implemented yet');
    }

    public function 
set_ConnectionString ($value) {
        throw new 
Exception('Function not implemented yet');
    }

    public function 
get_ServerName() {
        return 
$this->ServerName;
    }

    public function 
set_ServerName($value) {
        
$this->ServerName $value;
    }        
    
    public function 
get_Database() {
        return 
$this->Database;
    }

    public function 
set_Database($value) {
        
$this->Database $value;
    }        
    
    public function 
get_UserName() {
        return 
$this->UserName;
    }

    public function 
set_UserName($value) {
        
$this->UserName $value;
    }    

    public function 
get_Password() {
        return 
$this->Password;
    }

    public function 
set_Password($value) {
        
$this->Password $value;
    }        
    
//Todo: Eliminar este metodo.
    
public function get_Connection () {
        return 
$this->Connection;
    }
    
    
/******************************************************/
    /*               FUNCTIONS                            */
    /******************************************************/
    
public function BeginTransaction() {
        throw new 
Exception('Function not implemented yet');
    }
    
    public function 
EndTransaction() {
        throw new 
Exception('Function not implemented yet');
    }

    public function 
Close() {
        
mysql_close$this->Connection );
    }    
    
    public function 
Open() {
        
$this->Connection mysql_connect$this->get_ServerName(), $this->get_UserName(), $this->get_Password() );    
        if( 
$this->Connection ) {
            
mysql_select_db$this->get_Database() );
        }else{
            throw new 
Exception('DataBase Error: ' mysql_error() );
        }        
    }
    
    public function 
ChangeDatabase($Database){
        
$this->set_Database($Database);
        if( 
$this->Connection ) {
            
$this->Close();
        }        
        
$this->Open();
    }

    
    
/******************************************************/
    /*                Destruct                            */
    /******************************************************/
    
public function __destruct() {
    }
}

?>
soy explicito, solo es una parte de la clase, pues me interesa obtener sus comentarios y aportes, jejeje lo veo como una manera de mejorar y aprender mas, ya publicare el resto del grupo de clases.

Última edición por Snaft_J1; 07/08/2009 a las 20:19 Razón: Cambio en Funcion y tener encuenta algunas observaciones.
  #2 (permalink)  
Antiguo 01/08/2009, 16:07
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 16 años, 4 meses
Puntos: 139
Respuesta: [APORTE] Clase de Conexion a Base de Datos

Hey muchas gracias por el aporte.
Muy bueno .

Mi opinion como novato.

1- Veo muy trabajoso el hecho de tener que
crear la clase pasar los parametros

y luego llamar unas funciones Get para pasar nuevamente los datos de la conecion.

O sea la implementacion seria mas o menos como esta
Código PHP:
Ver original
  1. $db = new MySqlConnection('localhost','demo','123','prueba');
  2.  
  3. ## Cual es el sentido de volver hacer esto ?
  4.  
  5. $db ->get_Database('prueba');
  6. $db ->get_UserName('demo');
  7. $db ->get_Password('123');
  8. $db ->get_ServerName('localhost');
  9. ## ----------------------------------------------------
  10. $db ->open();


Esta parte yo la hubiece puesto de esta forma

Código PHP:
Ver original
  1. public function Open() {
  2.         $this->Connection = mysql_connect( $this->ServerName, $this->UserName, $this->Password );    
  3.         if( $this->Connection ) {
  4.             mysql_select_db( $this->Database );
  5.         }else{
  6.             throw new Exception('DataBase Error: ' . mysql_error() );
  7.         }        
  8.     }

Con eso se reduce a esto.

Código PHP:
Ver original
  1. $db = new MySqlConnection('localhost','demo','123','prueba');
  2. $db->open();

2- Como se si la conecion falla,
No le quedaria mal un manejador de errores.

Gracias nuevamente.
  #3 (permalink)  
Antiguo 01/08/2009, 17:34
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 18 años, 1 mes
Puntos: 8
Respuesta: [APORTE] Clase de Conexion a Base de Datos

Hola que tal.

tienes razon en las correcciones que me haces, peero, sucede que las funciones get_XXX son para obtener el valor almacenado en la clase (realmente no veo que en php exista el concepto de propiedades) entonces intente implementarlas dos metodos un get (obtener) y un set (establecer) para llevar acabo la funcionalidad de las mismas en php.


Código PHP:
$db = new MySqlConnection('localhost','demo','123','prueba');
 
## Cual es el sentido de volver hacer esto ?
 
$db ->get_Database('prueba'); 
$db ->get_UserName('demo');
$db ->get_Password('123');
$db ->get_ServerName('localhost');
## ----------------------------------------------------
$db ->open(); 
ups!!, es una razon de notar y es que creo que php no posee la sobrecarga de constructores, entonces quede un tanto mal ahi.

con respecto a:

Código PHP:
public function Open() { 
        
$this->Connection mysql_connect$this->ServerName$this->UserName$this->Password );     
        if( 
$this->Connection ) { 
            
mysql_select_db$this->Database ); 
        }else{ 
            throw new 
Exception('DataBase Error: ' mysql_error() ); 
        }         
    } 
je je je, en un principio lo tenia de esta manera, es solo que tengo cierta filosofia .Net y prefiero utilizar las propiedades (para este caso los metodos get, set), no obstante lo tendre en cuenta y voy a ejecutar ese cambio.

importanticimo eso que mensionas del manejo de errores para el caso de la apertura de la conexion, cuenta con que establecere un try... catch correspondiente.

mil gracias.

Última edición por Snaft_J1; 01/08/2009 a las 17:40
  #4 (permalink)  
Antiguo 01/08/2009, 19:38
Avatar de gjx2  
Fecha de Ingreso: agosto-2008
Ubicación: R.D
Mensajes: 1.153
Antigüedad: 16 años, 4 meses
Puntos: 139
Respuesta: [APORTE] Clase de Conexion a Base de Datos

Ok no se ni papa trabajar con .net
desconosco su filosifias .

Pero es que veo como de ma usar set
puedes seguir usando get , que en este caso es mas logico su uso.
por que quisas quieras ver el nombre del servidor
echo $db->get_ServerName()

Logicamente yo usaria set_funcion para hacer algo donde una funcion solo necesitara un parametro para su funcionamiento, ejemplo

Código PHP:
Ver original
  1. class Carrito{
  2.  
  3. private $valor;
  4. private $box;
  5. private $precio;
  6.  
  7.  
  8. public function Carrito($precio){
  9. $this->precio = $precio;
  10. }
  11.  
  12.  
  13.  
  14. public function set_Add($valor){
  15. $this->box = $valor;
  16. }
  17.  
  18.  
  19.  
  20. public function get_element(){
  21. return $this->box;
  22. }
  23.  
  24.  
  25. public function total(){
  26. return $this->box * $this->precio;
  27. }
  28.  
  29.  
  30.  
  31. }
  32.  
  33. $cal = new Carrito(2);
  34.  
  35.  for($a = 0;$a <= 5;$a++){
  36.  
  37.  $cal->set_Add($a); ## Aqui el set tiene logica
  38.  
  39.  }
  40.  
  41. echo $cal->get_element();

Si te fijas yo hago uso logico del set y el get.
Disculpa que ponga un ejemplo tan simple no es mi intencion ensenarte esa pendejadas.
Lo que sucede es que no le veo logica el asunto del metodo set_
ademas en tu clase no veo que internamente utilices set en ningun lado.

O sea que lo veo que sobra.

Suerte
  #5 (permalink)  
Antiguo 02/08/2009, 09:53
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 18 años, 1 mes
Puntos: 8
Respuesta: [APORTE] Clase de Conexion a Base de Datos

OK, valido eso.

te comprendo, claramente.

Código:
 ademas en tu clase no veo que internamente utilices set en ningun lado.
es que no se usa internamente, se usa desde el exterior, es un generico y se trata de que se envien desde afuera, pero aun asi tienes razon.

Gracias nuevamente.
  #6 (permalink)  
Antiguo 02/08/2009, 12:17
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 7 meses
Puntos: 2135
Respuesta: [APORTE] Clase de Conexion a Base de Datos

Te recomiendo como tip que leas el Zend Coding Standard.

Saludos.
  #7 (permalink)  
Antiguo 07/08/2009, 20:27
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 18 años, 1 mes
Puntos: 8
Respuesta: [APORTE] Clase de Conexion a Base de Datos

Buenas, he estado pensando en las recomendaciones que me han hecho, de hecho trate de actualizar no full el codigo anteior pero se de una manera funcional para todo aquel que le interese usarlo y no elimino los metodos que representan propiedades, pues tengo una serie de operaciones que los requieren y no es solo el hecho de generar conexiones en el constructor.

siguiendo entonces con mi post les publico la interface que es implementada en la clase de conexion:

Código PHP:
<?php

/** 
*  IDbConnection.interface.php
*
* @package     
* @subpackage  
* @name          IDbConnection 
* @version    $Id:$ 
* @author      Jacksson Enrique Mosquera Rivas
*/
interface IDbConnection {

    public function 
BeginTransaction();
    public function 
EndTransaction();
    public function 
Open();
    public function 
Close();
    
    public function 
get_ConnectionString();
    public function 
set_ConnectionString($value);
    public function 
get_ServerName();
    public function 
set_ServerName($value);
    public function 
get_Database();
    public function 
set_Database($value);
    public function 
get_UserName();
    public function 
set_UserName($value);
    public function 
get_Password();
    public function 
set_Password($value);
}
?>
Saludos...
  #8 (permalink)  
Antiguo 07/08/2009, 20:30
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 18 años, 1 mes
Puntos: 8
Respuesta: [APORTE] Clase de Conexion a Base de Datos

Bueno y con las dos clases siguientes si que me interesa obtener opiniones, pues las anteiores si que me han servido, espero puedan ver los resultados finales.

lo publico lo mas resumido posible para no alargar mucho, luego si alguno lo desea me envia un MP y se las mando al mail.

tengo algunas falencias y me interesaria lo probaran y aportaran informando como podrían ser mas optimas.

Código PHP:
<?php
final class MySqlCommand extends DbCommand {

    
/******************************************************/
    /*                 Internal Member                    */
    /******************************************************/
    
private $CommandText;
    private 
$CommandType;
    private 
$cnn;
    
    
/******************************************************/
    /*                 Construct                          */
    /******************************************************/
    
public function __construct($CommandText$Connection) {
        
$this->set_CommandText$CommandText );
        
$this->set_CommandTypeCommandType::Text );
        
$this->set_Connection$Connection );
    }
    
    
/******************************************************/
    /*                 Properties                         */
    /******************************************************/    
    
public function get_CommandText () {
        return 
$this->CommandText;
    }
    public function 
set_CommandText ($value) {
        
$this->CommandText $value;
    }
    public function 
get_CommandType () {
        return 
$this->CommandType;
    }
    public function 
set_CommandType ($value) {
        
$this->CommandType $value;
    }
    
    
/******************************************************/
    /*               FUNCTIONS                            */
    /******************************************************/    
    
public function ExecuteNonQuery (){
        switch( 
$this->get_CommandType() ) {
            case 
CommandType::StoredProcedure:
                
//TODO: CreateParameters for this option
                
$StrSql 'call ' $this->get_CommandText();  //(p1,p2)
                
break;
            case 
CommandType::TableDirect:
                
$StrSql 'Select * From ' $this->get_CommandText();
                break;
            case 
CommandType::Text:
                
$StrSql $this->get_CommandText();
                break;
        }

        
$result mysql_query$StrSql$this->get_Connection() );
        if( 
$result ) {
            return 
mysql_num_rows$result );
        }else{
            return 
0;
        }
    }
    
    public function 
ExecuteScalar (){    
        
$result mysql_query$this->get_CommandText() , $this->get_Connection() );
        if( 
$result ) {
            
$row mysql_fetch_row$result );
            return 
$row[0];
        }else{
            return 
0;
        }
    }
    
    public function 
ExecuteReader (){
        switch( 
$this->get_CommandType() ) {
            case 
CommandType::StoredProcedure:
                
//TODO: CreateParameters for this option
                
$StrSql 'call ' $this->get_CommandText();  //(p1,p2)
                
break;
            case 
CommandType::TableDirect:
                
$StrSql 'Select * From ' $this->get_CommandText();
                break;
            case 
CommandType::Text:
                
$StrSql $this->get_CommandText();
                break;
        }
        
        
$result mysql_query$StrSql$this->get_Connection() );
        if( 
$result ) {
            return 
$result;
        }else{
            return 
0;
        }
    }

}

?>
Saludos a todos.
  #9 (permalink)  
Antiguo 07/08/2009, 20:33
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 18 años, 1 mes
Puntos: 8
Respuesta: [APORTE] Clase de Conexion a Base de Datos

aqui esta el ultimo de esta seccion.

Código PHP:
<?php

abstract class DbCommand {

    private 
$Connection;

    
/******************************************************/
    /*                  Member                            */
    /******************************************************/

    
abstract public function get_CommandText ();
    abstract public function 
set_CommandText ($value);
    abstract public function 
get_CommandType ();
    abstract public function 
set_CommandType ($value);    
    
    abstract public function 
ExecuteNonQuery ();
    abstract public function 
ExecuteReader ();    //TODO: No abstract.
    
abstract public function ExecuteScalar ();    
    
    public function 
get_Connection() {
        return 
$this->Connection->get_Connection();
    }
    
    public function 
set_Connection($value) {
        if( !(
$value instanceof MySqlConnection ) ) {
            throw new 
Exception'el objeto debe implementar MySqlConnection' );
        }
        
$this->Connection $value;
    }    
    
}

?>

Enjoy It!!...
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 02:45.