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

Opinion sobre clase para MySQL

Estas en el tema de Opinion sobre clase para MySQL en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Amigos: empecé a re-re-inventar la rueda digo... a hacer mi clase para conectarme a MySQL Hasta aca lo que he hecho - sean libres de ...
  #1 (permalink)  
Antiguo 04/01/2009, 12:54
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Opinion sobre clase para MySQL

Amigos: empecé a re-re-inventar la rueda digo... a hacer mi clase para conectarme a MySQL

Hasta aca lo que he hecho - sean libres de criticar

Código PHP:
<?php 
class dbx {     
  private static 
$instancia;    // patron:  Singleton (una sola instancia)
    
  
private $con;
  private 
$user;
  private 
$pass;
  private 
$server;
  private 
$db
  private 
$sql;  // consulta
  
private $resultado;
  private 
$total// cantidad de resultados  => parsear la consulta para saber si es SELECT o DELETE/UPDATE
  
private $pos// registro actual
      
   // Desde aqui se obtiene la instancia OJO con el static 
    
public static function getInstance () {
        if (!isset(
self::$instancia)) {
            
$obj __CLASS__;
            
self::$instancia = new $obj;
        } 
        return 
self::$instancia;
   }  
  
  function 
setServer ($server){
    
$this->server=$server;
  }
    
  function 
setUser ($user){
    
$this->user=$user;
  }
  
  function 
setPass ($pass){
    
$this->pass=$pass;
  }
  
  function 
conectar($db){
    if (!isset(
$this->con)) {
      
$this->db=$db;   // setDb          
      
$this->con mysql_connect("localhost",$this->user,$this->pass) or die(mysql_error()); 
      
mysql_select_db($db) or die(mysql_error());  
     }    
  return (
$this->con);     // hago esto ??
  
}    

  function 
execute($sql){
    
$this->sql=$sql;  
    
$this->resultado mysql_query($this->sql);
    
    if ((
$consulta[0]=="S") OR ($consulta[0]=="s")) 
      
$this->total mysql_num_rows($this->resultado);   // SELECT 
    
else 
      
$this->total mysql_affected_rows($this->con); // INSERT, UPDATE, DELETE               
  
}    
    
  function 
next(){
    
$this->pos++; // avanzo al siguiente;      
  
}      
  
  function 
prev(){
    
$this->pos--; // avanzo al siguiente;      
  
}      

  function 
getTotal(){
    return (
$this->total);
  }
  
  function 
getOne($campo){        
    
$salida mysql_result($this->resultado,$this->pos,$campo);    
    return (
$salida);
  }    
  
  private function 
__construct(){     
     
$this->setServer("localhost"); // por defecto es localhost
     
$this->pos=0;     
  }  
  
   private function 
__clone() { 
        throw new 
Exception('No se permite clonar'); 
   } 
  
}    

 
$my dbx::getInstance(); // new dbx;   ya no uso NEW porque eso es para crear instancias multiples de un objeto
 
$my->setUser('mi_user');
 
$my->setPass('mi_pass');
 
$my->conectar('mi_base');
 
$my->execute("SELECT * FROM banned"); 
 echo 
"Total registros: ".$my->getTotal()."<br/>";
 echo 
$my->getOne('ip');
 echo 
$my->getOne('fecha');
?>
Caracteristicas:

* La clase utiliza el patron Singleton como ha sabido sugerir el amigo GatorV!

* Se parsea la consulta para determinar si es un SELECT u otro tipo de sentencia y elegir la funcion adecuada para determinar el numero de filas afectadas o seleccionadas (sobre esto habia una consulta respeto del rendimiento de la clase por el parseo pero se hizo extremadamente simple y rapido)
__________________
Salu2!

Última edición por Italico76; 05/01/2009 a las 11:59
  #2 (permalink)  
Antiguo 04/01/2009, 14:41
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Opinion sobre clase para MySQL (duda)

Mmmm no entiendo tu duda... que es en si lo que quieres hacer y lo que esperas de resultado??

Saludos.
  #3 (permalink)  
Antiguo 04/01/2009, 15:33
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Opinion sobre clase para MySQL (duda)

GatorV: quiero simplificarme la vida con esta clase pero no quiero perder en rendimiento..... y me pareció (ahora no estoy tan seguro) de que si cada vez que habia una consulta iba a parsearla para ver que tipo de operacion (SELECT / UPDATE, DELETE, INSERT) es (para elegir la funcion para contar resultados)... iba a degradar mucho.

En principio voy a corregir una bestialidad que por suerte nadie vió

Gracias......

Uhhhhhhhhhhhh!!! el numero diabolico de posts!
__________________
Salu2!
  #4 (permalink)  
Antiguo 04/01/2009, 15:59
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Opinion sobre clase para MySQL (duda)

Mmm pero el numero de filas solo lo puedes ver con mysql_num_rows, y de una consulta SELECT, las consultas UPDATE, DELETE, INSERT solo te dan las filas afectadas usando mysql_affected_rows y sobre la conexion, no sobre el resultado.

Saludos.
  #5 (permalink)  
Antiguo 04/01/2009, 16:44
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Pregunta Respuesta: Opinion sobre clase para MySQL (duda)

Cita:
Mmm pero el numero de filas solo lo puedes ver con mysql_num_rows, y de una consulta SELECT, las consultas UPDATE, DELETE, INSERT solo te dan las filas afectadas usando mysql_affected_rows y sobre la conexion, no sobre el resultado.
Totalmente de acuerdo! demasiado complicado para mi......asi que ya esta implementado en la clase parseo la sentencia y determino que funcion usar.

Ahora.... una DUDA IMPORTANTE y EXISTENCIAL sobre como la forma en que establezco la conexion:

Las conexiones las hago en el Index.php y siempre que alguien vaya a la home se va a ejecutar el new dbx ... digo... se va a instanciar un objeto de este tipo........ eso no me va a comer todos los recursos ???? como deberia hacer entonces ?

Estoy muy confundido.... no se que chequeo hacer en el __construct o donde hacerlo

Suplico vuestra ayuda
__________________
Salu2!
  #6 (permalink)  
Antiguo 04/01/2009, 16:52
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Opinion sobre clase para MySQL (duda)

Pues la idea es que uses el patrón Singleton para solo tener una instancia global de objeto y mejor llamar a un metodo conectar realmente al usar la conexion con la base de datos.

Saludos.
  #7 (permalink)  
Antiguo 04/01/2009, 16:58
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Opinion sobre clase para MySQL (duda)

GatorV: dá por descontado que voy a investigar lo que me dices..... y desde ya que muy agradecido........

Lo unico, no se NADA de patrones de diseño.... espero no verme superado!
__________________
Salu2!

Última edición por Italico76; 04/01/2009 a las 20:43
  #8 (permalink)  
Antiguo 04/01/2009, 22:19
Avatar de _ssx  
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 20 años, 11 meses
Puntos: 60
Respuesta: Opinion sobre clase para MySQL (duda)

Hola, podrias usar un patrón como singletón o bien usar

mysql_pconnect

Extraido del manual oficial..

mysql_pconnect() actua como mysql_connect() con dos diferencias fundamentales.

Primero, durante la conexión, la función intenta primero encontrar un enlace persistente abierto con el mismo host, usuario y password. Si lo encuentra, devuelve el identificador de enlace en lugar de abrir otra conexión.

Segundo, la conexión no será cerrada cuando acabe la ejecución del script. El enlace permanecerá abierta para ser usado en el futuro (mysql_close() no cierra el enlace establecido con mysql_pconnect()).

El parámetro opcional client_flags está disponible en PHP 4.3.0.

Este tipo de enlaces son llamados 'persistentes'.
__________________
Escribe tu código de forma que refleje, y saque a relucir,lo mejor de tu carácter personal
www.oscararzola.com/blog
Principios de un programador
  #9 (permalink)  
Antiguo 05/01/2009, 06:29
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Opinion sobre clase para MySQL

GatorV y _ssx: ya implementé el Singleton! a ver que les parece!!!

__________________
Salu2!
  #10 (permalink)  
Antiguo 05/01/2009, 10:08
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Opinion sobre clase para MySQL

Pues otra cosa, si te fijas diferentes funciones de MySQL actuan sobre diferentes variables, como te habia dicho, mysql_num_rows actua sobre el resultado de mysql_query, mysql_affected_rows actua sobre mysql_connect.

Por lo que creo que deberias de separar tu clase, una clase MySQL_Result, y la otra MySQL normal para lo que es la conexion, porque imaginate que pasa si quieres enviar dos querys del tipo SELECT y hacer un loop sobre ambas?

Saludos.
  #11 (permalink)  
Antiguo 05/01/2009, 11:10
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Opinion sobre clase para MySQL

Cita:
Por lo que creo que deberias de separar tu clase, una clase MySQL_Result, y la otra MySQL normal para lo que es la conexion, porque imaginate que pasa si quieres enviar dos querys del tipo SELECT y hacer un loop sobre ambas?
No entiendo lo me decis... podrias darme un ejemplo de esa consulta ? no hay siempre UNA consulta de base ?

Digo... un INSERT INTO.......... SELECT ...WHERE no deja de ser un "INSERT" por ejemplo.

No estoy seguro de haber entendido algo de lo que me decis
__________________
Salu2!
  #12 (permalink)  
Antiguo 05/01/2009, 11:23
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Opinion sobre clase para MySQL

Que pasa si quieres hacer dos consultas anidadas?, como por ejemplo SELECT * FROM personas, y dentro de ese loop quieres hacer SELECT * FROM opciones WHERE persona=id, para obtener datos de otra tabla en base a lo que esta dentro del loop?

O que tal que dentro del loop necesitas hacer unos updates, si usas tu clase, vas a reescribir la variable de resultado y vas a probocar un error.

Saludos.
  #13 (permalink)  
Antiguo 06/01/2009, 11:04
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Respuesta: Opinion sobre clase para MySQL

Estimado Italico76:

Lamento que constantemente se repitan en el foro las mismas consultas sobre cómo crear una clase de abstracción de base de datos. Ya creo que hay muchas preguntas que se responden en el foro durante *toda nuestra vida* que podrían dar alguna pista

En primera instancia y viendo solo el código te puedo decir que:


Te muestro a grueso modo cómo quedaría:

Código PHP:
<?php

class Database
{
    private static 
$_instancia;

    private 
$_con;
    private 
$_user;
    private 
$_pass;
    private 
$_server 'localhost';
    private 
$_db;
    private 
$_sql;
    private 
$_resultado;
    private 
$_total;
    private 
$_pos 0;

    
/* Si es privado, no se usa nunca */
    
private function __construct(){}

    public static function 
getInstance()
    {
        if (!isset(
self::$_instancia)) {
            
$obj __CLASS__;
            
self::$_instancia = new $obj;
        }
        return 
self::$_instancia;
    }
    public function 
setServer($server)
    {
        
$this->_server $server;
    }
    public function 
setUser($user)
    {
        
$this->_user $user;
    }
    public function 
setPass($pass)
    {
        
$this->_pass=$pass;
    }
    public function 
conectar($db)
    {
        if (!isset(
$this->_con)){
            
            
$this->_db $db;

            
$this->_con mysql_connect(
                
$this->_server,
                
$this->_user,
                
$this->_pass) or die(mysql_error()
            );
            
mysql_select_db($db) or die(mysql_error());
        }
    }
    public function 
execute($sql)
    {
        
$this->_sql $sql;

        
$this->_resultado mysql_query($this->_sql);

        if (
strtolower($consulta[0]) == 's'){
            
$this->_total mysql_num_rows($this->_resultado);
        }else{
            
$this->_total mysql_affected_rows($this->_con);
        }        
    }
    public function 
next()
    {
        
$this->_pos++;
    }
    public function 
prev()
    {
        
$this->pos--; 
    }
    public function 
getTotal()
    {
        return 
$this->total;
    }
    public function 
getOne($campo)
    {
        return 
mysql_result($this->_resultado,$this->_pos,$campo);
    }
    private function 
__clone()
    {
        throw new 
Exception('No se permite clonar');
    }
}

$my dbx::getInstance();

$my->setUser('mi_user');
$my->setPass('mi_pass');
$my->conectar('mi_base');

$my->execute('SELECT * FROM banned');

echo 
"Total registros: ".$my->getTotal()."<br/>";
echo 
$my->getOne('ip');
echo 
$my->getOne('fecha');
En mi opinión separaría las responsabilidades en dos clases, Database maneja todas las conexiones y operaciones hacia la misma y otra clase Sql que se encargue de generar las consultas sql y validaciones, luego decides si Database debe recibir solo objetos de tipo Sql o simplemente la consulta generada.

De la misma forma, podrías generar una clase más genérica Database y abastraer los tipos de manejadores (MySQL, PostgreSQL, etc), pero todo dependerá qué quieres hacer y si te es útil.

Por lo pronto el hecho que todo tu sistema dependa de tu Database genera el efecto de "capa de abstracción", si mañana tienes que cambiar de motor solo modificas esa clase, no todo tu sistema.

"No hay problema en informática que no se resuelva con otra capa de abstracción"
__________________
Blog phpsenior.com Cursos a Distancia surforce.com

Última edición por enriqueplace; 06/01/2009 a las 11:11
  #14 (permalink)  
Antiguo 08/01/2009, 08:49
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Opinion sobre clase para MySQL

Enrique: me han sido muy utiles tus comentarios.......

... quisiera hacer lo que decis de la separacion en dos clases porque de hecho ahora agregué operaciones mas especificas de MySQL asi que lo haré como dices en cuanto entienda un poco mas

Aca la ultima version [hay una mas....fijate mas abajo por favor] que funciona perfecto con mi lote de pruebas:

Código PHP:
<?php

class Database
{
    private static 
$_instancia;

    private 
$_con;
    private 
$_user;
    private 
$_pass;
    private 
$_server 'localhost';
    private 
$_db;
    private 
$_sql;
    private 
$_resultado;
    private 
$_total;
    private 
$_pos 0;

    
/* Si es privado, no se usa nunca */
    
private function __construct(){}

    public static function 
getInstance()
    {
        if (!isset(
self::$_instancia)) {
            
$obj __CLASS__;
            
self::$_instancia = new $obj;
        }
        return 
self::$_instancia;
    }
    public function 
setServer($server)
    {
        
$this->_server $server;
    }
    public function 
setUser($user)
    {
        
$this->_user $user;
    }
    public function 
setPass($pass)
    {
        
$this->_pass=$pass;
    }
    public function 
connect($db)
    {
        if (!isset(
$this->_con)){
            
            
$this->_db $db;

            
$this->_con mysql_connect(
                
$this->_server,
                
$this->_user,
                
$this->_pass) or die(mysql_error()
            );
            
mysql_select_db($db) or die(mysql_error());
        }
    }
    public function 
execute($sql)
    {
        
$this->_sql $sql;

        
$this->_resultado mysql_query($this->_sql);

        if (
strtolower($consulta[0]) == 's'){
            
$this->_total mysql_num_rows($this->_resultado);
        }else{            
            
$this->_total mysql_affected_rows($this->_con);
        }        
    }
    public function 
next()
    {
        
$this->_pos++;
    }
    public function 
prev()
    {
        
$this->pos--; 
    }
    public function 
getTotal()
    {
        return 
$this->_total;
    }
    public function 
getOne($campo)
    {
        return 
mysql_result($this->_resultado,$this->_pos,$campo);
    }    
    public function 
getMulti()  // get into an array
    
{
        return 
mysql_fetch_array($this->_resultado);
    }        
    public function 
insert ($my_table$my_array) {  // mysql_insert_array:  as opposite of mysql_fetch_array:     
      
$keys array_keys($my_array); 
      
$values array_values($my_array); 
      
$sql 'INSERT INTO ' $my_table .' VALUES ("' implode('","'$values) . '")'
      echo 
$sql;
      
$this->execute ($sql);    
    }    
    public function 
goRow ($fila_num){
      return 
mysql_data_seek ($this->_resultado$fila_num);
    }  
    public function 
fetchRow (){  // se trae una fila Y deja los campos en un array
      
return mysql_fetch_assoc($this->_resultado);
    }  
    private function 
__clone()
    {
        throw new 
Exception('No se permite clonar');
    }
}
?>
__________________
Salu2!

Última edición por Italico76; 08/01/2009 a las 09:27
  #15 (permalink)  
Antiguo 08/01/2009, 09:25
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Exclamación Fatal error: Access level to sql::$_server must be protected (as in class database)

Bueno... quiero hacer la separacion de clases...... como dijo Enrique, sobre todo porque quiero resolver algo que me criticó sabiamente el amigo GatorV.

El problema es cuando intento lo basico, o sea ... crear la clase abstracta y definir algunas cosas como protected o abstract...... me sale un error que no encuentro en Google

Cita:
Fatal error: Access level to sql::$_server must be protected (as in class database) or weaker in C:\xampp\htdocs\dir2.com\db-class3.php on line 107
El punto es que en linea 107 no hay una instruccion!!! alguien me podria ayudar ? gracias desde ya!!!!!!!!!

Ah! yo asumo que la que tiene que tener el patron singleton es la clase hija..... (o las clases hijas) porque me parece que es lo que tiene sentido. O no?

Código PHP:
<?php
abstract class database{
    protected 
$_con;
    protected 
$_user;
    protected 
$_pass;
    protected 
$_server;
    protected 
$_db;
    protected 
$_resultado;
    protected 
$_total;
    protected 
$_pos;
    
    function 
setServer($server)
    {
        
$this->_server $server;
    }
    function 
setUser($user)
    {
        
$this->_user $user;
    }
    function 
setPass($pass)
    {
        
$this->_pass=$pass;
    }
    
    abstract function 
connect($db);
    
    abstract function 
execute($consulta);
}

class 
sql extends database
{
    private static 
$_instancia;  
    private 
$_server 'localhost';        

    
/* Si es privado, no se usa nunca */
    
private function __construct(){}

    public static function 
getInstance()
    {
        if (!isset(
self::$_instancia)) {
            
$obj __CLASS__;
            
self::$_instancia = new $obj;
        }
        return 
self::$_instancia;
    }
    public function 
connect($db)
    {
        if (!isset(
$this->_con)){
            
            
$this->_db $db;

            
$this->_con mysql_connect(
                
$this->_server,
                
$this->_user,
                
$this->_pass) or die(mysql_error()
            );
            
mysql_select_db($db) or die(mysql_error());
        }
    }
    public function 
execute($sql)
    {
        
$this->_sql $sql;
        
$this->_resultado mysql_query($this->_sql);        
    }
    public function 
next()
    {
        
$this->_pos++;
    }
    public function 
prev()
    {
        
$this->pos--; 
    }
    public function 
getTotal()
    {        
        if (
strtolower($this->_sql[0]) == 's'){
             
$this->_total mysql_num_rows($this->_resultado);
        }else{                       
             
$this->_total mysql_affected_rows($this->_con);
        }                 
      return 
$this->_total;
    }
    public function 
getOne($campo)
    {
        return 
mysql_result($this->_resultado,$this->_pos,$campo);
    }    
    public function 
getMulti()  // get into an array
    
{
        return 
mysql_fetch_array($this->_resultado);
    }        
    public function 
insert ($my_table$my_array) {  // mysql_insert_array:  as opposite of mysql_fetch_array:     
      
$keys array_keys($my_array); 
      
$values array_values($my_array); 
      
$sql 'INSERT INTO ' $my_table .' VALUES ("' implode('","'$values) . '")'
      echo 
$sql;
      
$this->execute ($sql);    
    }    
    public function 
goRow ($fila_num){
      return 
mysql_data_seek ($this->_resultado$fila_num);
    }  
    public function 
fetchRow (){  // se trae una fila Y deja los campos en un array
      
return mysql_fetch_assoc($this->_resultado);
    }  
    private function 
__clone()
    {
        throw new 
Exception('No se permite clonar');
    }
}

 
$my database::getInstance(); // new dbx;   ya no uso NEW porque eso es para crear instancias multiples de un objeto
 
$my->setUser('user');
 
$my->setPass('pass');
 
$res1 =$my->connect('db');
 
$my->execute("SELECT * FROM `es_contenido` WHERE 1"); 
 echo 
"Total registros: ".$my->getTotal()."<br/>";
?>
gracias desde ya!!!!!!!
__________________
Salu2!
  #16 (permalink)  
Antiguo 08/01/2009, 09:32
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Opinion sobre clase para MySQL

Pues el problema es que en tu clase abstracta defines a $_server como protected, y en la clase heredada como private, al decirte que weaker es que debe de ser public, o protected, private es mas arriba en la visibilidad.

Saludos
  #17 (permalink)  
Antiguo 08/01/2009, 10:46
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Opinion sobre clase para MySQL

GatorV: muchisimas gracias!!!! no sabes como me zafastes..... voy a tener que estudiar bien el tema ese de la 'visibilidad'

Ahora anda bien.... y ademas de getTotal(), hice getTotalSelected() y getTotalAffected() asi si hay anidamientos entre un INSERT y un SELECT (como vos me decias) ya puedo obtener por separado los resultados

getTotal() lo he dejado porque aunque es muy particular... es el caso mas comun xD


Código PHP:
<?php
abstract class database{
    protected 
$_con
    protected 
$_user;
    protected 
$_pass;
    protected 
$_server;
    protected 
$_db;
    protected 
$_consulta;
    protected 
$_resultado;    
    protected 
$_pos;
    
    function 
setServer($server)
    {
        
$this->_server $server;
    }
    function 
setUser($user)
    {
        
$this->_user $user;
    }
    function 
setPass($pass)
    {
        
$this->_pass=$pass;
    }
    
    abstract function 
connect($db);
    
    abstract function 
execute($consulta);
    
    abstract function 
getTotal();
}

class 
sql extends database
{
    private static 
$_instancia;  
    public 
$_server 'localhost';        
    
    
/* Si es privado, no se usa nunca */
    
private function __construct(){}

    public static function 
getInstance()
    {
        if (!isset(
self::$_instancia)) {
            
$obj __CLASS__;
            
self::$_instancia = new $obj;
        }
        return 
self::$_instancia;
    }
    public function 
connect($db)
    {
        if (!isset(
$this->_con)){
            
            
$this->_db $db;

            
$this->_con mysql_connect(
                
$this->_server,
                
$this->_user,
                
$this->_pass) or die(mysql_error()
            );
            
mysql_select_db($db) or die(mysql_error());
        }
    }
    public function 
execute($sql)
    {    
        
$this->_consulta $sql;                
        
$this->_resultado mysql_query($this->_consulta);          
    }
    public function 
next()
    {
        
$this->_pos++;
    }
    public function 
prev()
    {
        
$this->pos--; 
    }
    public function 
getTotal()  // para consultas simples (sin anidamientos)
    
{                
      if (
strtolower($this->_consulta[0]) == 's'){
        return 
mysql_num_rows($this->_resultado);
      }else{                       
        return 
mysql_affected_rows($this->_con);
      }        
    }    
    public function 
getTotalSelected()
    {       
      return  
mysql_num_rows($this->_resultado);     
    }
    public function 
getTotalAffected()
    {       
      return  
mysql_affected_rows($this->_con);  
    }        
    public function 
getOne($campo)
    {
        return 
mysql_result($this->_resultado,$this->_pos,$campo);
    }    
    public function 
getMulti()  // get into an array
    
{
        return 
mysql_fetch_array($this->_resultado);
    }        
    public function 
insert ($my_table$my_array) {  // mysql_insert_array:  as opposite of mysql_fetch_array:     
      
$keys array_keys($my_array); 
      
$values array_values($my_array); 
      
$sql 'INSERT INTO ' $my_table .' VALUES ("' implode('","'$values) . '")';       
      
$this->execute ($sql);    
    }    
    public function 
goRow ($fila_num){
      return 
mysql_data_seek ($this->_resultado$fila_num);
    }  
    public function 
getRow (){  // se trae una fila Y deja los campos en un array
      
return mysql_fetch_assoc($this->_resultado);
    }  
    private function 
__clone()
    {
        throw new 
Exception('No se permite clonar');
    }
}
?>
Quiero expresar mi agradecimiento por su infinita paciencia y constante colaboracion a Enrique y GatorV
__________________
Salu2!
  #18 (permalink)  
Antiguo 08/01/2009, 10:53
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Opinion sobre clase para MySQL

A lo que me referia es, que pasa si haces dos selects y necesitas trabajar sobre ambos resultados??.

Por eso te decia separar en dos clases la parte del resultado de la conexion asi cada método execute te devuelve otro objeto del tipo result por ejemplo.

Saludos
  #19 (permalink)  
Antiguo 08/01/2009, 11:11
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Opinion sobre clase para MySQL

Es verdad! guardo por ejemplo la posicion ($_pos) y eso depende de la tabla con la que estoy trabajando

Por que soy tan nabo?!
__________________
Salu2!
  #20 (permalink)  
Antiguo 08/01/2009, 11:20
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Opinion sobre clase para MySQL

Si te fijas por ejemplo PDO tiene 2 clases base, la clase PDO como tal, PDOStatement para enviar Querys y leer resultados, asi puedes enviar n querys y trabajar con cada una de forma independiente.

Saludos.
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:56.