Paginador de consultas en PHP y MySQL

En esta ocación les traigo un paginador de consultas en PHP, este esta asociado a consultas en MySQL, pero la pueden modificar segun sus nececidades. Cuando realizamos una consulta en MySQL, la hacemos por lo regular de la siguiente forma:

SELECT * FROM MiTabla;

Claro a veces con sus filtros y con la sentencia Where, pero bueno esta es solo un ejemplo. Supongamos que el resultado de nuestra consulta nos develve 20 registros, no son demasiados y se pueden mostrar tranquilamente en una pagian HTML, pero que pasaría si el resultado que nos devuelve son 1,000 registros, como que mostrarlos es una sola pagina seria, además de lento, antiestético. Pos ese es nuestro objetivo tratar de implementar una clase, echa por yo, para paginar el resultado de una consulta. Después de una breve introducción manos a la obra.

Empecemos por la parte de MySQL. la instrucción SELECT acepta una clausula llamada LIMIT, la cual nos sirve para restringir el numero de registros devueltos por nuestra consulta.

LIMIT tiene uno o dos argumentos, que deben ser enteros positivos. El primero especifica el desplazamiento del primer registro a devolver, y el segundo la cantidad de registros a devolver. Si no se especifica el desplazamiento este se toma como Cero (0), que es el desplazamiento inicial. Ejemplos:

SELECT * FROM MiTabla LIMIT 5;     # Devuelve los primeros 5 registros
SELECT * FROM MiTabla LIMIT 5,10;  # Devuelve los registros del 6 al 15

Comprendido ya este tema, ahora veamos como podemos aplicar esto en PHP. En esta ocasión vamos a programar un poquito, bueno digo un poquito porque no me gusta la programación orientada a objetos, con clases. Pego el código fuente y después vemos la explicación:

<?PHP
class Paginador
{
 var $pag = 0;
 var $desde = 0;
 var $hasta = 0;
 var $consulta = "";

 function Paginador()
 {
 ?>
 <script language="javascript" type="text/javascript">
 function pagina(pag,formulario)
 {
 direccion = document.forms[formulario].action.split("?pag=");
 document.forms[formulario].action = direccion[0] + "?pag=" + pag;
 document.forms[formulario].submit();
 }
 </script>
 <?PHP
 }

 function inicia($var_pag, $consult, $num=10)
 {
 if(isset($var_pag) && $var_pag>0)
 $this->pag = $var_pag;
 else
 $this->pag = 1;

 /* Si el usuario define cuantos registros quiere ver por pagina*/
 if($_POST['paginador_num'])
 {
 $num = $_POST['paginador_num'];
 }

 /* Para no perder la consulta al cambiar de pagina*/
 if($_POST['paginador_query'])
 $consult = $_POST['paginador_query'];

 $this->hasta = $num;
 $this->consulta = $consult;
 $this->desde=($this->hasta*$this->pag)-$this->hasta;
 }

 function imprime($url,$posicion,$otros="")
 {
 $todos = 0;
 $result = mysql_query($this->consulta);
 if($result)
 $todos = mysql_num_rows($result);
 $paginas=ceil($todos/$this->hasta);

 // Evita el desfazamiento del contador de pagina
 if($this->pag > $paginas)
 {
 $this->desde = 0;
 $this->pag = $paginas;
 }

 echo '<div align="center">';
 echo '<form name="form_paginador'.$posicion.'" action="'.$url.'" method="post" onsubmit="">';
 echo '<input type="hidden" name="paginador_query" value="'.$this->consulta.'" />';
 echo "<!-- INICIO OTROS -->".$otros." <!-- FIN OTROS -->";
 echo '<table><tr height="24px" align="center">';
 echo "<td>Registros por p&aacute;gina:
   <input type='text' size='2' name='paginador_num' value='".$this->hasta."'></td>";
 if($this->pag>1)
 echo "<td width=\"23\">
    <a href=\"#\" onclick=\"pagina('1','form_paginador".$posicion."');\" title=\"Primero\">
    <img src=\"images/primero.gif\" border=\"0\" align=\"absbottom\"/></a></td>
 <td>|</td>
 <td width=\"23\">
    <a href=\"#\" onclick=\"pagina('".($this->pag-1)."','form_paginador".$posicion."');\" title=\"Anterior\">
    <img src=\"images/anterior.gif\" border=\"0\" align=\"absbottom\"/></a></td>";
 echo "<td>|</td><td><b><u>P&aacute;gina ".$this->pag."/".$paginas."</u></b><td>|</td>";
 if($this->pag<$paginas)
 echo "<td width=\"23\">
    <a href=\"#\" onclick=\"pagina('".($this->pag+1)."','form_paginador".$posicion."');\" title=\"Siguiente\">
    <img src=\"images/siguiente.gif\" border=\"0\" align=\"absbottom\"/></a></td>
 <td>|</td>
 <td width=\"25\"><a href=\"#\" onclick=\"pagina('".($paginas)."','form_paginador".$posicion."');\"title=\"Último\">
    <img src=\"images/ultimo.gif\" border=\"0\" align=\"absbottom\"/></a></td>";
 echo "<td><b> (Total : ".$todos." registros) </b></td></tr></table></form></div>";
 }

 function query()
 {
 //echo $this->consulta." LIMIT ".$this->desde.", ".$this->hasta;
 if($this->desde < 0) $this->desde = 0;
 //echo $this->consulta." LIMIT ".$this->desde.", ".$this->hasta;;
 return $this->consulta." LIMIT ".$this->desde.", ".$this->hasta;
 }
}
?>

Como ven se crea una clase a la cual se le llama Paginador, esta clase contiene cuatro atributos principales:

$pag = Hace referencia hacia la pagina siguiente.
$desde = indica el Desplazamiento de la sentencia limit;
$hasta = incida la cantidad de registros que devuelve la consulta;
$consulta = El query SQL sin la clausuala LIMIT;

Ahora hablemos de las funciones:

Paginador() = Este es el constructor, este imprime la función en JavaScript que nos permite enviar los datos a la siguiente pagina.
inicia($var_pag, $consult, $num=10) = esta es la primera función que se debe ejecutar, $var_pag contiene la pagina actual que se debe mostrar, $consult es el query SQL y $num es el numero de registros por paginas que se deben mostrar, este por default es 10.
imprime($url,$posicion,$otros=””) = esta funcion imprime el paginado, $url es la misma pagina, $posion es un entero cualquiera, en realidad no se pa que esta jejeje, $otros son datos estras que nos pueden servir para ejecutar un sentencia mas especifica, como por ejemplo un filtro de usuarios de solo chiapas, etc.
query() = esta función devuelve el query SQL, en formato texto, con su respectivo LIMIT ya procesado.

Ejemplo de implementación:

/* PAGINADOR */
 $consulta = 'SELECT * FROM MiTabla';
 $paginador = new Paginador();
 $paginador->inicia($_GET['pag'],$consulta);

 $resultado = ejecutaQuery($paginador->query());

 $otros = '<input type="hidden" name="filtro" value="'.$_POST['filtro'].'" />';

 $paginador->imprime('pagina.php','1',$otros);

Si observan la variable $resultado contiene el result_set, por asi decir, resultado de la consulta, esa variable es la qe debemos utilizar para imprimir los resultados.

Espero les sirva esta pequeña clase, les prormeto qe para la proxima la voy a depurar bien y la voy hacer con JQuery, la cual todavia no la domino bien, he ahi que esta clase utiliza el metodo POST y tiene que refrescar toda la pagina, pero ya pronto les tendre la Version 2 del Paginador con JQuery.

4 pensamientos en “Paginador de consultas en PHP y MySQL

  1. Pingback: Los números de 2010 « El Blog de P4scu41

    • Hola tcdaza, es un gusto saber que es de utilidad este humilde blog, la clase que publique la hice ya hace un rato, tiene una gran desventaja que realiza peticiones al servidor en cada ocasión que avanzas o retrocedes en las páginas, te recomendaría que utilizaras la librería DataTables es muy fácil de utilizar, dinámica, además de no realizar peticiones innecesarias al servidor, actualmente utilizó esa, me ha servido de mucho, si tienes algún problema con todo gusto te puedo ayudar…

      Saludos…

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s