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.

Correción de los Acentos en PHP y MySQL

Bueno va mi primer post, espero que se de mucha utilidad. Resulta que los que nos gusta o tenemos la necesidad de hacer algún sistemita en PHP y MySQL, en ocasiones, los acentos o caracteres de código ascii extendido como la ñ,?,<>, … no se muestran bien o no se guardan como deben ser, cuando se registran desde PHP, por ejemplo un sistema donde se tenga que registrar los comentarios de los visitantes, o un sistema para registrar personas, etc.

El detalle en este problemilla radica en el tipo de codificación que utilizan en el encabezado de la pagina PHP y el de MySQL, a lo que llamamos comúnmente “char set” o conjunto de caracteres, en espanish, MySQL comúnmente utiliza para el Cliente, o sea la consolita, utf8 y para las bases de datos latin1, bueno tonces vamos a ver como darle solución.

Si buscan en san google van a encontrar que esto se puede solucionar colocando la codificación utf8 al encabezado HTML, pero aquí va una solución, que desde hace un buen rato me ha funcionado a la perfección.

Pa los que trabajan Dreamweaver, like me, si le dan crear un nuevo documento html observarán que en el encabezado aparece la siguiente linea de código:

<meta http-equiv=”Content-Type” content=”text/html; charset=windows-1252″ />

Esta linea indica el conjunto de caracteres que la pagina va a utilizar, bueno en esta tenemos que modificar el valor de charset por “iso-8859-1”. Al final debe quedar así:

<meta http-equiv=”Content-Type” content=”text/html; charset=iso-8859-1″ />

Esto es en la parte de PHP, ahora vamos a MySQL. Cuando creamos nuestra base de datos por lo regular la hacemos de la siguiente manera:

Create database MiBasesita;

Si ya tenemos creada la base de datos, entonces escribimos la siguiente linea para modificar el charset de la base de datos:

alter database MiBasesita default character set utf8 collate utf8_general_ci;

Con eso modificaran el conjunto de caracteres de la base de datos, recuerden que por default MySQL le asigna latin1.

Ahora al imprimir el resultado de alguna consulta les recomiendo que utilicen la función htmlentities();

Espero y les funcione, Suerte…

Bienvenidos

Bienvenidos, bueno por fin me decidi a crear mi blog, desde hace un buen tiempo tenia ganas de hacer mi propi Blog, espero que comenten todos mis post y opinen que piensan, se reciben sugerencias con el proposito de mejorar. Los post por lo regular seran de programacion, ya ven que me gusta mucho todo lo que tenga que ver con programar, pero tambien intentare postear otra cosas que tenga que ver con tecnologia e informatica, bueno por lo pronto les agradesco que visiten mi Blog, y los invito a que lo sigan visitando…