Paginación de registros de una base MySQL con PHP y jQuery – Parte 2

Hola a todos, esta es la continuación de post anterior titulado Paginación de registros de una base MySQL con PHP y jQuery – Parte 1 en el cual se explico la parte del código jQuery y ahora toca el turno de ver el código PHP, comenzemos.

CODIGO PHP

Archivo: obtenerdatos.php

Lo primero que hacemos es crear un objeto de la clase stdClass el cual va a almacenar la respuesta del servidor


$respuesta = new stdClass();

Posteriormente verificamos si se recibió el numero de pagina que se desea mostrar, si no se recibió la respuesta entonces el estado de la respuesta lo ponemos a 0 y asignamos un mensaje de error. y esos datos son los que se van a devolver.

if( !isset ($_POST["pagina"]) ){
    $respuesta->estado = 0;
    $respuesta->mensaje = "Ocurrió un error";
}

Si se recibió el numero de pagina entonces asignamos las variables que vamos a utilizar: $pagina, $filasxpagina y $paginasamostrar

else{
    $pagina = $_POST["pagina"];
    $filasxpagina = $_POST["filasxpagina"];
    $paginasamostrar = $_POST["paginasamostrar"];

Lo siguiente es establecer la conexión con la base de datos

    $conexion = new mysqli("servidor","usuario","contrasenia","ejemplos",3306);

Y ejecutamos una primer consulta que obtiene el total de registros que se van a paginar, dicho valor lo almacenamos en una variable con el nombre $numfilas

    $consulta = "SELECT COUNT(*) AS total FROM tblalumno ";
    $result = $conexion->query($consulta);
    $fila = $result->fetch_array();
    $numfilas = $fila['total'];

Posteriormente evaluamos si hay filas a mostrar, en caso de que sea verdadero entonces obtenemos el numero de paginas dividiendo el numero de filas entre el numero de filas por pagina y lo redondeamos hacia arriba para que obtengamos un numero entero. Tambien obtenemos el valor a partir del cual vamos a empezar a mostrar los registros multiplicando el numero de filas por pagina y la pagina a mostrar y a ese resultado le restamos la cantidad de filas por pagina.

    if( $numfilas > 0 ) {
        $numpaginas = ceil($numfilas/$filasxpagina);
        $inicio = $filasxpagina*$pagina - $filasxpagina;

Con los valores obtenidos previamente ejecutamos una segunda consulta que obtendrá los datos a mostrar en la pagina.

    $consulta = "SELECT * from tblalumno LIMIT $inicio, $filasxpagina";
    $result = $conexion->query($consulta);

Con los datos obtenidos de la consulta empezamos a estructurar la respuesta e iniciamos con los encabezados de columnas los cuales los obtenemos con la funcion fetch_fields().

    $encabezados = $result->fetch_fields();
    $respuesta->encabezados .= "<tr>";
    foreach ($encabezados as $encabezado) {
    	$respuesta->encabezados.="<th>".$encabezado->name."</th>";
    }
    $respuesta->encabezados .="</tr>";

Una vez que terminamos con los encabezados seguimos con los datos

    while ( $fila = $result->fetch_array() ) {
        $respuesta->datos .= "<tr>";
        for($x = 0; $x<count($encabezados); $x++){
             $respuesta->datos .=" <td>".$fila[$x]."</td>";
        }
        $respuesta->datos .= "</tr>";
    }

Ahora solo nos queda agregar a la respuesta los números de pagina que se van a mostrar y para ello debemos de definir cual es la primer y ultima pagina que va a aparecer en la paginacion

    $mitadinicio = floor(($paginasamostrar-1)/2);
	$mitadfin = ceil(($paginasamostrar-1)/2);
	$inicio = $pagina - $mitadinicio;
		
	if($inicio <= 0) {
		$inicio = 1;
	}
	$limitepagina = $pagina + $mitadfin;
	if(($limitepagina - $inicio) != ($paginasamostrar-1)) {
		$limitepagina = $inicio + ($paginasamostrar-1);
	}
	if($limitepagina > $numpaginas) {
		$inicio = $numpaginas - ($paginasamostrar-1);
		$limitepagina = $numpaginas;
	}
	if($inicio <= 0) {
		$inicio = 1;
	}

Una vez que se obtuvo la pagina de inicio y la ultima pagina se empieza a estructurar la respuesta y comenzamos con los botones de primer pagina y pagina anterior los cuales se van a mostrar siempre y cuando la pagina que se va a mostrar no sea la pagina mayor que y el total de paginas sea mayor que el numero de paginas a mostrar en la paginacion

if($pagina > 1 && $numpaginas > $paginasamostrar){
	$respuesta->paginacion .= '<a href="#" id="1" class="pagina">&laquo;</a>';
	$respuesta->paginacion .= '<a href="#" id="'.($pagina + -1).'" class="pagina">&lsaquo;</a>';
}

Despues con un ciclo se van agregando a la respuesta los numeros de pagina que se van a mostrar partiendo de la pagina de inicio hasta el limite que se haya definido

for($inicio; $inicio <= $limitepagina; $inicio++ ){
	if($inicio == $pagina)
		$respuesta->paginacion .= '<a href="#" id="'.$inicio.'" class="pagina actual">'.$inicio.'</a>';
	else
		$respuesta->paginacion .= '<a href="#" id="'.$inicio.'" class="pagina">'.$inicio.'</a>';
}

y al final agregamos los botones de ultima pagina y pagina siguiente que se van a mostrar cuando la pagina a mostrar no sea la ultima y el numero de paginas sea mayor que el numero de paginas a mostrar en la paginacion

if($pagina < $numpaginas && $numpaginas > $paginasamostrar){
	$respuesta->paginacion .= '<a href="#" id="'.($pagina + 1).'" class="pagina">&rsaquo;</a>';
	$respuesta->paginacion .= '<a href="#" id="'.$numpaginas.'" class="pagina">&raquo;</a>';
}

si todo ocurrio correctamente agregamos el estado de la respuesta con el valor 1

    $respuesta->estado = 1;

después cerramos el if que habíamos abierto mas arriba y le agregamos el else con la respuesta a 0 y el mensaje de que no hay registros para mostrar

    } else {
        $respuesta->estado = 0;
        $respuesta->mensaje = "No hay resultados";
    }

Y ya para terminar convertimos la respuesta a JSON y la imprimimos con echo

    echo json_encode($respuesta);
}

Aquí les dejo el código completo.

    $respuesta = new stdClass();
	
	if( !isset ($_POST["pagina"]) ){
		$respuesta->estado = 0;
		$respuesta->mensaje = "Ocurrio un error";	
	}
	else{
		
		$pagina = $_POST["pagina"];		
		$filasxpagina = $_POST["filasxpagina"];
		$paginasamostrar = $_POST["paginasamostrar"];
		
		$conexion = new mysqli("localhost","root","","ejemplos",3306);
		$consulta = "SELECT COUNT(*) AS count FROM tblalumno ";
    	$result = $conexion->query($consulta);
		$fila = $result->fetch_array();
		$numfilas = $fila['count'];
	
		if( $numfilas > 0 ) {
		
			$numpaginas = ceil($numfilas/$filasxpagina);
			$inicio = $filasxpagina*$pagina - $filasxpagina;

			$consulta = "SELECT * from tblalumno LIMIT $inicio, $filasxpagina";
			$result = $conexion->query($consulta);		
			
			$encabezados = $result->fetch_fields();	
			$respuesta->encabezados .= "<tr>";
			foreach ($encabezados as $encabezado) {
    	   		$respuesta->encabezados.="<th>".$encabezado->name."</th>";				
			}   	
			$respuesta->encabezados .="</tr>"; 
	
			while ( $fila = $result->fetch_array() ) {
				$respuesta->datos .= "<tr>";
				for($x = 0; $x<count($encabezados); $x++){	
    		   		$respuesta->datos .=" <td>".$fila[$x]."</td>"; 	
				}  
				$respuesta->datos .= "</tr>";
			}
				
			$mitadinicio = floor(($paginasamostrar-1)/2);
			$mitadfin = ceil(($paginasamostrar-1)/2);
			$inicio = $pagina - $mitadinicio;
		
			if($inicio <= 0) {
				$inicio = 1;
			}
			$limitepagina = $pagina + $mitadfin;
			if(($limitepagina - $inicio) != ($paginasamostrar-1)) {
				$limitepagina = $inicio + ($paginasamostrar-1);
			}
			if($limitepagina > $numpaginas) {
				$inicio = $numpaginas - ($paginasamostrar-1);
				$limitepagina = $numpaginas;
			}
			if($inicio <= 0) {
				$inicio = 1;
			}
			
			if($pagina > 1 && $numpaginas > $paginasamostrar){
				$respuesta->paginacion .= '<a href="#" id="1" class="pagina">&laquo;</a>';
				$respuesta->paginacion .= '<a href="#" id="'.($pagina + -1).'" class="pagina">&lsaquo;</a>';
			}
		
			for($inicio; $inicio <= $limitepagina; $inicio++ ){
				if($inicio == $pagina)
					$respuesta->paginacion .= '<a href="#" id="'.$inicio.'" class="pagina actual">'.$inicio.'</a>';
				else
					$respuesta->paginacion .= '<a href="#" id="'.$inicio.'" class="pagina">'.$inicio.'</a>';
			}
			if($pagina < $numpaginas && $numpaginas > $paginasamostrar){
				$respuesta->paginacion .= '<a href="#" id="'.($pagina + 1).'" class="pagina">&rsaquo;</a>';
				$respuesta->paginacion .= '<a href="#" id="'.$numpaginas.'" class="pagina">&raquo;</a>';
			}
			$respuesta->estado = 1;
		} else {
			$respuesta->estado = 0;
			$respuesta->mensaje = "No hay resultados";
		}
	}
		
	echo json_encode($respuesta);

La tercera parte del tutorial trata del codigo CSS para nuestra tabla y paginacion.

10 comentarios en “Paginación de registros de una base MySQL con PHP y jQuery – Parte 2”

  1. moscar dice:

    ya esta la tercera parte?, gracias por el aporte…

    1. denker dice:

      Hola, talvez la otra semana si me da tiempo saque la ultima parte de este ejemplo, saludos

  2. Cosme dice:

    Hola, una consulta, ya esta la parte 3? los archivos se pueden descargar? Gracias!!!!!

    1. denker dice:

      Hola, no me ha dado tiempo hacer la tercera parte, el código es todo el que esta publicado. Espero que me la otra semana de desocupe un poco y haga la tercera parte. saludos

  3. gio orozco dice:

    que buen ejemplo, seria bueno adicionarle el ccs.
    espero que lo puedas hacer pronto.
    Saludos

  4. juan dice:

    Hola, podrías proporcionarme el archivo completo, o tal vez el archivo CSS.

  5. jua dice:

    Buen día.
    podrías enviarme tu código.

  6. alejandro dice:

    Saludos uni la parte uno y la parte 2 y no funciono
    me muestra el siguiente error parsererror SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data

    podria colocar el codigo completo para descargarlo

Deja un comentario