Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Frameworks y PHP orientado a objetos (http://www.forosdelweb.com/f68/)
-   -   Clase para usar bases de Datos Mysql (http://www.forosdelweb.com/f68/clase-para-usar-bases-datos-mysql-575609/)

lucasan 13/04/2008 15:43

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. :arriba:

lucasan 14/04/2008 12:35

Re: Clase para usar bases de Datos Mysql
 
Quisiera conocer sus opiniones. Me resultan enriquecedoras en mi proceso de aprendizaje.

Gracias.

zsamer 14/04/2008 15:09

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.

lucasan 19/04/2008 00:55

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. :-)


La zona horaria es GMT -6. Ahora son las 09:29.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.