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

PDO distintas BD pero y los LIMIT 0,40

Estas en el tema de PDO distintas BD pero y los LIMIT 0,40 en el foro de Frameworks y PHP orientado a objetos en Foros del Web. He estado utilizando PDO para trabajar con las BD por varias razones, es POO, inmune a inyeccion SQL segun he leido, etc... y tambien que ...
  #1 (permalink)  
Antiguo 08/04/2011, 23:45
Avatar de anacona16  
Fecha de Ingreso: marzo-2010
Ubicación: Bogota DC
Mensajes: 610
Antigüedad: 14 años, 1 mes
Puntos: 52
PDO distintas BD pero y los LIMIT 0,40

He estado utilizando PDO para trabajar con las BD por varias razones, es POO, inmune a inyeccion SQL segun he leido, etc... y tambien que si se cambiar el driver puedes facilmente cambiar de BD.

Habia trabajado PDO con MySQL, me han dicho: "Trabaja con Postgres, es mas robusto y ahora con Oracle no se sabe que va a pasar con MySQL" y me dije bueno como estan facil cambiar de BD utilizando PDO pues voy a hacer una prueba, cambie el driver en la conecion de my por pg se conecto bien, cuando voy a listar tengo una consulta con LIMIT 0,40 (para paginacion) y me salta error, busque el LIMIT aca en FW y para postgres hay que hacer asi LIMIT 40 OFFSET 0 y en un modelo se puede cambiar pero ¿si tienes muchos modelos?

Entonces al fin si funciona lo mismo para todas las BD soportadas o no...
__________________
Aprendiendo!!!
  #2 (permalink)  
Antiguo 09/04/2011, 02:42
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: PDO distintas BD pero y los LIMIT 0,40

Que tal anacona16,

Cuando se dice que es portable, se refiere a que el API, es la misma para todos los motores, por ejemplo, para ejecutar una query independientemente de si es mysql, postgres u oracle, utilizas execute, no tiene que ver con la sintaxis SQL de cada motor.

Con respecto al cambio en los modelos, primero el paginador debería ser una clase y segundo si estas repitiendo el código en varios modelos, tenes un problema de diseño.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 09/04/2011, 09:12
Avatar de anacona16  
Fecha de Ingreso: marzo-2010
Ubicación: Bogota DC
Mensajes: 610
Antigüedad: 14 años, 1 mes
Puntos: 52
Respuesta: PDO distintas BD pero y los LIMIT 0,40

Hola masterpuppet gracias por tu aclaracion

Cita:
Cuando se dice que es portable, se refiere a que el API, es la misma para todos los motores, por ejemplo, para ejecutar una query independientemente de si es mysql, postgres u oracle, utilizas execute, no tiene que ver con la sintaxis SQL de cada motor.
Ahora entiendo!

Cita:
Con respecto al cambio en los modelos, primero el paginador debería ser una clase y segundo si estas repitiendo el código en varios modelos, tenes un problema de diseño.
Ahora si me hiciste preocupar, para paginacion si utilizo una clase, bastante buena por cierto http://objetivophp.com/?p=101 simplemete donde la necesito pues le paso los parametros y ya.

Ahora con repecto a tu segunda observacion de problema de diseño mas me preocupo, mira este es el modelo de clientes para listarlo (Donde esta la paginacion):

Código PHP:
Ver original
  1. function listarProveedores($db)
  2. {
  3.     $consultaProveedores    = $db->query("SELECT * FROM tb_proveedores");      
  4.     $cantRegistros          = $consultaProveedores->rowCount();
  5.     $limit              = 20;
  6.    
  7.     $pag = new Paginador();
  8.    
  9.     $pgnActual          = isset($_GET['pgn'])? $_GET['pgn'] : 0;       
  10.    
  11.     $datos              = $pag->paginar($pgnActual, $cantRegistros);
  12.     $inicio                 = $pgnActual * $limit;
  13.    
  14.     $consultaProveedores    = $db->query("SELECT * FROM tb_proveedores LIMIT $inicio, $limit");
  15.    
  16.     return $datos[]         = array("consultaProveedores"   => $consultaProveedores->fetchAll(),
  17.                                     "cantRegistros"         => $cantRegistros, "datos" => $datos, "pag" => $pag->getCantidadPaginas());        
  18. }

Ahora el modelo de proveedores:

Código PHP:
Ver original
  1. function listarClientes($db)
  2. {
  3.     $consultaClientes   = $db->query("SELECT * FROM tb_clientes");     
  4.     $cantRegistros      = $consultaClientes->rowCount();
  5.     $limit              = 20;      
  6.    
  7.     $pag = new Paginador();
  8.    
  9.     $pgnActual      = isset($_GET['pgn'])? $_GET['pgn'] : 0;
  10.    
  11.     $datos          = $pag->paginar($pgnActual, $cantRegistros);
  12.     $inicio             = $pgnActual * $limit;
  13.    
  14.     $consultaClientes   = $db->query("SELECT * FROM tb_clientes LIMIT $inicio, $limit");
  15.    
  16.     return $datos[]     = array("consultaClientes" => $consultaClientes->fetchAll(),
  17.                                 "cantRegistros" => $cantRegistros, "datos" => $datos, "paginas" => $pag->getCantidadPaginas());        
  18. }

Como veras son modelos diferentes, cada uno en un script php separado y cada uno con el resto de tareas a BD.

Como son modelos diferentes pues cada uno tienes su LIMIT 0,20.

¿Esta bien asi o si estoy cometiendo el error de diseño?

Gracias.
__________________
Aprendiendo!!!

Última edición por anacona16; 09/04/2011 a las 09:33
  #4 (permalink)  
Antiguo 09/04/2011, 10:47
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: PDO distintas BD pero y los LIMIT 0,40

A ver, estas trabajando OOP ?, estas utilizando MVC ?, porque no veo la visibilidad declarada en los métodos y los modelos acceden directamente al GET.

Y creo que tenes un problema en tu diseño, las dos funciones son prácticamente iguales, la diferencia es la tabla que atacan, podes postear las dos clases completas ? o al menos un resumen de las mismas.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 09/04/2011, 11:05
Avatar de anacona16  
Fecha de Ingreso: marzo-2010
Ubicación: Bogota DC
Mensajes: 610
Antigüedad: 14 años, 1 mes
Puntos: 52
Respuesta: PDO distintas BD pero y los LIMIT 0,40

Estoy trabajando con MVC pero no con OOP completamente, solo la clase paginador, esas funciones la llama el controlador que dependiendo de la accion muestra una vista.
__________________
Aprendiendo!!!
  #6 (permalink)  
Antiguo 09/04/2011, 12:39
Avatar de _ssx  
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 20 años, 11 meses
Puntos: 60
Respuesta: PDO distintas BD pero y los LIMIT 0,40

Hola

Creo que necesitas trabajar más aún con tu modelo de manejo de datos con SQL, ya que estas manejando tu SQL "A mano" en mi parecer necesitas un objeto "intermedio" o adaptador que se ocupe te acomodar las consultas y convertirlas al MODELO de base de datos adecuado..

El método query debería de ser un método "wrapper" del método query de PDO para que puedas aplicar reglas especificas del motor que estas usando antes de enviar la query al motor de base de datos.

Código PHP:

interface Adapter{
    public function 
query($consulta,$params,$limit);
}

class 
MySql implements Adapter{
   public function 
query($consulta,$params,$limit){
          
//Aqui creas tu cadena SQL conforme lo hace Mysql con los paremetros enviados.
          
return $consulta.$params.$limit;
  }
}

class 
PostGres implements Adapter{
   public function 
query($consulta,$params,$limit){
          
//Aqui creas tu cadena SQL conforme lo hace Postgres con los paremetros enviados.
          
return $consulta.$params.$limit.' OFFSET ';
  }
}

class 
Db{
     private 
$_adapter;
     private 
$_db;

     public function 
setAdapter(Adapter $adapter){
          
$this->_adapter $adapter;
     }
     
     public function 
query($consulta,$params,$limits){
           
$this->_db->query($this->_adapter('SELECT','campos',array(0,4)));
     }

Algo así el chiste es que tengas un "wrapper" antes de dejar caer los datos sobre PDO

Ahora si cumplirias tu objetivo de SOLO cambiar la base de datos en el setAdapter ;)

Por que MySQL, Postgress o ORACLE estarian cumpliendo con el CONTRATO de implementación de la interface.

Código PHP:
$db->setAdapter(new Mysql());
$db->setAdapter(new Postgress()); 
Cabe mencionar que los frameworks actuales tienen ya super bien definidos sus adaptadores para que no te manejes el SQL a mano
__________________
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

Etiquetas: bd, distintas, limit, pdo
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 16:02.