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

Clase para usar bases de Datos Mysql

Estas en el tema de Clase para usar bases de Datos Mysql en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola a todos, se que clases como esta hay miles en la red, pero como apenas me inicio en PHP orientado a objetos, pues es ...
  #1 (permalink)  
Antiguo 13/04/2008, 15:43
Avatar de lucasan
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: Cali - Colombia
Mensajes: 1.144
Antigüedad: 16 años, 10 meses
Puntos: 59
Clase para usar bases de Datos Mysql

Hola a todos,

se que clases como esta hay miles en la red, pero como apenas me inicio en PHP orientado a objetos, pues es la primera que estoy haciendo.

He buscado en el foro y no hay ninguna similar, entonces me gustaría ponerla en un aporte, tal vez a alguién le pueda servir.

Bueno, el tema de ponerla aquí es por si alguién le quiere dar una mirada y corregirle o añadirle lo que sea necesario, y así hacer un buen aporte a la comunidad.

A la clase le añadí una función que encontré en el foro, la verdad no recuerdo quien la posteó pero se lleva el crédito, es la función para realizar consultas seguras con variables externas (POST, GET y COOKIES).

Es mas, si alguien experimentado puede revisar dicha función, ya que no soy experto en el tema.

Código PHP:
<?php

/**
* Clase BD
* Util para crear, consultar, modificar 
* bases de datos Mysql, así como conectarse
* y desconectarse de la misma.
*/

class Bd {
    
    private 
$server//Nombre del servidor
    
private $user//Usuario de la Base de Datos
    
private $pass// Password del Usuario
    
private $bd//Nombre de la Base de Datos
    
private $conection//Link de la conexion
    
private $conected//Estado de la conexion Boolean
    
private $sql//Consulta Sql Sring
    
private $result// Resultado de la consulta
        
    
function setConf ($server$user$pass){
        
$this->server $server;
        
$this->user $user;
        
$this->pass $pass;
    } 
//Ingresa el nombre del Servidor, el usuario y la contraseña
    
    
function getServer () {
    return 
$this->server;
    } 
//Devuelve el nombre del servidor
    
    
function getUser () {
        return 
$this->user;
    } 
//Devuelve el nombre de usuario
    
    
function getPass () {
        return 
$this->pass;
    } 
//Devuelve el Password
    
    
function setBd ($bd) {
        
$this->bd $bd;
    } 
//Ingresa la base de datos a conectar
    
    
function getBd () {
        return 
$this->bd;
    } 
//Devuelve el nombre de la Base de Datos
    
    
public function Conect (){
        if (
$this->conection mysql_connect($this->server$this->user$this->pass)){
            
true;
        }
        else {
            
false;
        }
    } 
//Conecta con el servidor
    
    
public function selectBd () {
        if (
$this->conected mysql_select_db($this->bd$this->conection)){
            
true;
        }
        else {
            
false;
        } 
    } 
//Seleciona la base de datos a conectarse.
    
    
public function setSql ($sql) {
        
$this->sql $sql;
    } 
//Ingresa la sentencia Sql
    
    
public function Consult () {
        
$this->result mysql_query($this->sql$this->conection);
    }
//Realiza la consulta a la Base de Datos
    
    
public function getRegArray (){
        return 
mysql_fetch_array($this->result);
    }
//Devuelve los registros en un arreglo
    
    
public function getRegObject (){
        return 
mysql_fetch_object($this->result);
    }
//Devuelve los registros como objeto
    
    
public function freeRes (){
        return 
mysql_free_result($this->result);
    }
//Libera la memoria usada por el resultado
    
    
public function closeCon (){
        return 
mysql_close($this->conection);
    }
//Cierra la conexion establecida
    
    /**
    * Funcion de seguridad para realizar consultas con
    * variables recibidas por GET, POST o COOKIE.
    * Esta funcion es independiente del valor de magic_quotes en el php.ini
    * $var recibe la variable externa
    */
    
public function secureQuery($var//Variable recibida por POST, GET o COOKIE
    
{
    
// Retirar las barras
    
if (get_magic_quotes_gpc()) {
        
$valor stripslashes($var);
    }

    
// Colocar comillas si no es entero
    
if (!is_numeric($var)) {
        
$valor "'" mysql_real_escape_string($var) . "'";
    }
    return 
$var//Devuelve contenido seguro para realizar la consulta sql.
    
}
}
?>
Es mas, no se comentar bien, si alguién pudiera documentarla sería genial.

La idea es poder ofrecer un buen aporte a los usuarios del foro.

Saludos y mil gracias.
__________________
Plan Original Desarrollo Web
~$>sudo apt-get install -f
"Asi debería arreglarse todo en la vida"
  #2 (permalink)  
Antiguo 14/04/2008, 12:35
Avatar de lucasan
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: Cali - Colombia
Mensajes: 1.144
Antigüedad: 16 años, 10 meses
Puntos: 59
Re: Clase para usar bases de Datos Mysql

Quisiera conocer sus opiniones. Me resultan enriquecedoras en mi proceso de aprendizaje.

Gracias.
__________________
Plan Original Desarrollo Web
~$>sudo apt-get install -f
"Asi debería arreglarse todo en la vida"
  #3 (permalink)  
Antiguo 14/04/2008, 15:09
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
Re: Clase para usar bases de Datos Mysql

Hola,

Tu clase se ve bien pero tengo algunos aportes:

1.- Deberías implementar el patrón singleton para asegurar que siempre vas a tener una única instancia de la clase evitando la creación de objetos pertenecientes, además podrás hacer uso de ella en cualquier parte de tu aplicación sin la necesidad de abrir más de una conexion a la base de datos.

2.- Tu clase la deberías de dividir en dos una para la conexión y otra para el manejo del resultado(ResultSet).

3.- Implementar clase Factory para tener adapters (uno para cada motor de base de datos, mysql, oracle, mssql, etc)

Ejemplo Sencillo:

Clase DB (MYSQL)
Código PHP:
class MySQL
{
    private static 
$_instance NULL;
    private 
$conId;
    private 
$host;
    private 
$user;
    private 
$password;
    private 
$database;

    
/***************************************************/
    /* <SINGLETON>                                     */
    /***************************************************/     
    
static public function getInstance(array $param_db
    { 
        if (
self::$_instance == NULL
        { 
            
self::$_instance = new self($param_db);
        }
        return 
self::$_instance
    }
//fin getInstance
    /***************************************************/
    /* </SINGLETON>                                      */
    /***************************************************/
        
    
public function __construct(array $options=array())
    {
        if(
count($options)<4)
        {
            throw new 
Exception('Invalid number of connection parameters');
        }
        
        foreach(
$options as $parameter=>$value)
        {
            if(!
$value)
            {
                throw new 
Exception('Invalid parameter'.$parameter);
            }
            
$this->{$parameter} = $value;
        }
        
$this->connectDB();
    }
    
    
// connect to database
    
private function connectDB()
    {
        if(!
$this->conId=mysql_connect($this->host,$this->user,$this->password))
        {
            throw new 
Exception('Error connecting to the server');
        }
        if(!
mysql_select_db($this->database,$this->conId))
        {
            throw new 
Exception('Error selecting database');
        }
    }
    
    
// run query
    
public function query($query)
    {
        if(!
$this->result=mysql_query($query,$this->conId))
        {
            throw new 
Exception('Error performing query'.$query);
        }
        
        return new 
Result($this,$this->result);
    }

Clase Result:
Código PHP:
class Result
{
    private 
$mysql;
    private 
$result;
    
    public function 
__construct(MySQL $mysql$result)
    {
        
$this->mysql=$mysql;
        
$this->result=$result;
    }
    
    
// fetch row
    
public function fetchAll()
    {
        
//return mysql_fetch_assoc($this->result);
          
$rows = array();      
          while (
$row mysql_fetch_array$this->resultMYSQL_ASSOC )) {
              
array_push($rows$row);
          }
          
          return 
$rows;
    }
    
    
// count rows
    
public function countRows()
    {
        if(!
$rows=mysql_num_rows($this->result)){
            throw new 
Exception('Error counting rows');
        }
        return 
$rows;
    }
    
    
// count affected rows
    
public function countAffectedRows()
    {
        if(!
$rows=mysql_affected_rows($this->mysql->conId)){
            throw new 
Exception('Error counting affected rows');
        }
        return 
$rows;
    }
    
    
// get insert ID
    
public function getInsertID()
    {
        if(!
$id=mysql_insert_id($this->mysql->conId)){
            throw new 
Exception('Error getting ID');
        }
        return 
$id;
    }
    
    
// seek rows
    
public function seekRow($row=0)
    {
        if(!
int($row)||$row<0){
            throw new 
Exception('Invalid result set offset');
        }
        if(!
mysql_data_seek($this->result,$row)){
            throw new 
Exception('Error seeking data');
        }
    }
    
    
// return result set
    
public function getResult()
    {
        return 
$this->result;
    }

Clase Factory (Patrón Factory):
Código PHP:
class Db_Factory
{    
    
// The factory method
    
public static function &factory($type$param_db)
    {
        if (
class_exists($typefalse)) 
        {
            
$classname call_user_func( array($type'getInstance'),$param_db ); 
            
//$classname = MySQL::getInstance($param_db);
            
return $classname;
        } else {
           throw new 
Exception ('Driver not found');
        }
    }

¿Cómo se usa?

Código PHP:
try
{
    
// connect to MySQL
    
$param_db = array(    'host'=>'localhost',
                        
'user'=>'user',
                        
'password'=>'password',
                        
'database'=>'mibd');
            
    
$db Db_Factory::factory('MySQL',$param_db);
    
    
// get result set
    
$result $db->query('SELECT * FROM posters');
    
    foreach (
$result->fetchAll() as $row
    {
        print 
$row['id']."<br />";
        print 
$row['username']."<br />";
        print 
$row['email']."<br />";
    }
    
    
//print_r($result->fetchAll());
    //var_dump($result->fetchAll());
    
} catch(Exception $e) {
    echo 
$e->getMessage();
    exit();

Te recomiendo PDO para desarrollar tu clase de abstracción de base de datos, en ves de las funciones de mysql, por un millon de razones, 100% OOP, mucho mejor rendimiento, PHP5 et....

saludos.

Última edición por zsamer; 14/04/2008 a las 15:22
  #4 (permalink)  
Antiguo 19/04/2008, 00:55
Avatar de lucasan
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: Cali - Colombia
Mensajes: 1.144
Antigüedad: 16 años, 10 meses
Puntos: 59
Re: Clase para usar bases de Datos Mysql

Hola zsamer, gracias por tu respuesta, pero no busco una clase ya hecha, como mencioné, sé que hay cientas, tal vez miles, sino que hice una (muy, pero muy básica) para aprender, y tal vez poder mejorarla con la ayuda de ustedes.

Ahora que veo lo compleja de una clase de esas, no pretendo mejorarla para su uso definitivo, sino con fines de aprendizaje.

Gracias por tu ayuda, he estado leyendo de singleton, la verdad no entiendo mucho, pero ahi voy.
__________________
Plan Original Desarrollo Web
~$>sudo apt-get install -f
"Asi debería arreglarse todo en la vida"
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 13:06.