Ver Mensaje Individual
  #3 (permalink)  
Antiguo 14/04/2008, 15:09
zsamer
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 21 años
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