PHP - Paginación de resultados Mysqli

 
Vista:
sin imagen de perfil
Val: 34
Ha aumentado su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Paginación de resultados Mysqli

Publicado por Juan Carlos (19 intervenciones) el 14/12/2016 11:55:25
Hola a todos, os explico mi problema a ver si por favor me podeis echar una mano.

Tengo una tabla de noticias a la que le he puesto que me muestre 1 resultado por página y tengo hecha una paginación que funciona perfectamente tipo:

Ant 1 2 3 4 5 6 7 8 9 10 11 12 13 14 , etc Sig

Lo que no sé es como hacer para generar una brecha después de varios adyacentes, es decir que apareciese la paginación de la siguiente manera:

Ant 1 2 3 4 5 ... 6 ... 125 Sig. (125 sería el último registro)

y que al pulsar en el 6 mostrara la paginación asi:

Ant. 1 ... 6 7 8 9 10 ... 11 125 Sig. (125 sería el último registro)

Este es el código que estoy utilizando para la consulta:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$Pagina = (isset($_GET['Pagina']) && !empty($_GET['Pagina']))?$_GET['Pagina']:1;
$per_page = 1; // 10 la cantidad de registros que desea mostrar
$adjacents  = 2; //4 brecha entre páginas después de varios adyacentes
$offset = ($Pagina - 1) * $per_page;
//Cuenta el número total de filas de la tabla*/
$query_EXTRAE_REGISTROS   = mysqli_query($conexion,"SELECT count(*) AS Id_noticia FROM noticias");
if ($row_EXTRAE_REGISTROS= mysqli_fetch_array($query_EXTRAE_REGISTROS)){$totalRows_EXTRAE_REGISTROS = $row_EXTRAE_REGISTROS['Id_noticia'];}
$Total_paginas = ceil($totalRows_EXTRAE_REGISTROS/$per_page);
//$reload = 'noticias.php';
//consulta principal para recuperar los datos
$EXTRAE_REGISTROS = mysqli_query($conexion,"SELECT Id_noticia, Titulo, Orden_producto, Fecha FROM noticias ORDER BY Fecha DESC LIMIT $offset,$per_page");?>

Y este el el de la paginación
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
for($i=1; $i<$Total_paginas+1; $i++)
 
 
if($_GET['Pagina'] == $i) // Es igual a la pagina que estoy lo resalto
{
 
	echo '<li class=active><a href="?Pagina='.$i.'&Lugar='.$_GET['Lugar'].'">'.$i.'</a></li>';
}
else // No lo resalto
{
	echo '<li><a href="?Pagina='.$i.'&Lugar='.$_GET['Lugar'].'">'.$i.'</a></li>';
}
?>

Decir también que la pagina es de bootstrap.

Muchas gracias anticipadas por la ayuda !!!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de VRM
Val: 152
Ha disminuido su posición en 6 puestos en PHP (en relación al último mes)
Gráfica de PHP

Paginación de resultados Mysqli

Publicado por VRM (192 intervenciones) el 15/12/2016 11:25:54
Hola:

Mira a ver si te vale esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<?php
// Funciones
function muestra($conjunto) {
	echo "<br>";
	for ( $i = 0; $i < count($conjunto); $i++ ) {
		if ($conjunto[$i] != "..." ) {
			echo " <a href='#'>$conjunto[$i]</a>";// Enlace a lo que sea
		} else {
			echo "...";
		}
	}
}
 
function union($conjunto1, $conjunto2) {
	$salida = null;
	/**
	 * Hay tres casos posibles:
	 * 1) Los conjuntos son disjuntos y hay almenos 1 página de separación entre ellos.
	 *    Ejemplo {1 2} y {4 5 6 7 8}
	 * 2) Los conjuntos son disjuntos pero van seguidos
	 *    Ejemplo {1 2} y {3 4 5 6 7}
	 * 3) Los conjuntos se solapan
	 * 	  Ejemplo {1 2} y {2 3 4 5 6}
	 */
	$diferencia = $conjunto2[0] - $conjunto1[count($conjunto1) - 1];
	// ***** Caso 1 **********
	if ( $diferencia > 1 ) {
		for ( $i = 0; $i < count($conjunto1); $i++ ) {
			$salida[] = $conjunto1[$i];
		}
		$salida[] = "...";
		for ( $i = 0; $i < count($conjunto2); $i++ ) {
			$salida[] = $conjunto2[$i];
		}
	}
	// ***** Caso 2 y 3 **********
	if ( $diferencia <= 1 ) {
		for ( $i = 0; $i < count($conjunto1) + $diferencia - 1; $i++ ) {
			$salida[] = $conjunto1[$i];
		}
		for ( $i = 0; $i < count($conjunto2); $i++ ) {
			$salida[] = $conjunto2[$i];
		}
	}
	return $salida;
}
 
/**
 * Función paginacion
 * 
 * @param 	int $iniciales 		 	número de páginas al principio
 * @param 	int $adyacentesAntes 	número de páginas adyacentes antes de la actual
 * @param 	int $paginaActual		página actual
 * @param 	int $adyacentesDespues	número de páginas adyacentes después de la actual
 * @param 	int $finales 		    número de páginas al final
 * @param 	int $numPaginas       	número de páginas en total
 * @return	void
 */
function paginacion($iniciales, $adyacentesAntes, $paginaActual, $adyacentesDespues, $finales, $numPaginas) {
	// Conjunto inicial
	$conjuntoInicial = null;
	for ( $i = 1; $i <= $iniciales; $i++ ) {
		$conjuntoInicial[] = $i;
	}
	// Conjunto adyacente
	$conjuntoAdyacente = null;
	$adyacenteInicial = $paginaActual - $adyacentesAntes;
	if ( $adyacenteInicial < 1 ) $adyacenteInicial = 1;
	for ( $i = $adyacenteInicial; $i <= $paginaActual + $adyacentesDespues; $i++ ) {
		$conjuntoAdyacente[] = $i;
	}
	// Conjunto final
	$conjuntoFinal = null;
	for ( $i = $numPaginas - $finales + 1; $i <= $numPaginas; $i++ ) {
		$conjuntoFinal[] = $i;
	}
	// Une conjuntos
	$conjuntoTotal = union($conjuntoInicial, $conjuntoAdyacente);
	$conjuntoTotal = union($conjuntoTotal, $conjuntoFinal);
	// Muestra
	muestra($conjuntoTotal);
}
 
paginacion(2, 2, 1, 2, 2, 125);
paginacion(2, 2, 2, 2, 2, 125);
paginacion(2, 2, 3, 2, 2, 125);
paginacion(2, 2, 4, 2, 2, 125);
paginacion(2, 2, 5, 2, 2, 125);
paginacion(2, 2, 6, 2, 2, 125);
 
paginacion(2, 2, 70, 2, 2, 125);
 
paginacion(2, 2, 125, 2, 2, 125);
paginacion(2, 2, 124, 2, 2, 125);
paginacion(2, 2, 123, 2, 2, 125);
paginacion(2, 2, 122, 2, 2, 125);
paginacion(2, 2, 121, 2, 2, 125);
paginacion(2, 2, 120, 2, 2, 125);
 
?>

La función que hace la paginación es paginacion(). En la función muestra() hay que poner los enlaces a cada una de las páginas. Yo he puesto # pero habrá que poner los enlaces correspondientes.

Si ejecutas tal y como está sale:
1
2
3
4
5
6
7
8
9
10
11
12
13
1 2 3... 124 125
1 2 3 4... 124 125
1 2 3 4 5... 124 125
1 2 3 4 5 6... 124 125
1 2 3 4 5 6 7... 124 125
1 2... 4 5 6 7 8... 124 125
1 2... 68 69 70 71 72... 124 125
1 2... 123 124 125
1 2... 122 123 124 125
1 2... 121 122 123 124 125
1 2... 120 121 122 123 124 125
1 2... 119 120 121 122 123 124 125
1 2... 118 119 120 121 122... 124 125

Que son los casos que he considerado: cuando la página actual está cerca del principio o del final, que es lo más problemático. Para cualquier duda aquí estoy.

Saludos de Víctor.-
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 34
Ha aumentado su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Paginación de resultados Mysqli

Publicado por Juan Carlos (19 intervenciones) el 15/12/2016 16:23:58
Hola Victor buenas tardes. Lo primero de todo es agradecerte tu respuesta.

No veo la forma de implementar el código que has puesto... Lo he copiado y pegado y el resultado es este:
pantallazopantallazo

El total de páginas a mostrar lo saco de "$Total_paginas = ceil($totalRows_EXTRAE_REGISTROS/$per_page);"
y el total de páginas no tiene porqué ser 125 ya que lógicamente ese valor irá variando...

Tampoco veo como pasarle el valor de la página en la que está actualmente (en el código que puse se lo paso con $_GET['Pagina'] o $Pagina ni como generar el enlace a 123 ... 124 125 que sería tipo enlace.php?pagina=xxxxx para que se vaya a dicha página.

Un saludo y gracias de nuevo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de VRM
Val: 152
Ha disminuido su posición en 6 puestos en PHP (en relación al último mes)
Gráfica de PHP

Paginación de resultados Mysqli

Publicado por VRM (192 intervenciones) el 15/12/2016 19:24:53
Hola:

Puedes hacerlo de muchas maneras. Yo te cuento una.

Lo que yo te he desarrollado es una función que se llama paginacion (lineas de 59 a 82) que utiliza otras dos funciones: muestra (lineas 3 a 12) y union (lineas 14 a 46). Debes copiar estas lineas (desde la 1 a la 82) y pegarla en un archivo que se llame, por ejemplo: funciones.php. En el archivo principal (y en cualquier otro que use estas funciones) de tu aplicación debes poner
1
include_once("funciones.php");
. Ojo a la ruta!. Lo mejor es dejarlo en la misma carpeta que el archivo principal.

Cuando quieras mostrar la paginación debes escribir:
1
paginacion(...);
Los parámetros de la función son 6. Los tienes explicados entre las lineas 51 a 56.

Suponiendo que quieras que aparezca al menos las tres primeras páginas, dos páginas por delante de la que se está mostrando, cuatro por detrás y una al final. El numero de páginas es:
1
$Total_paginas = ceil($totalRows_EXTRAE_REGISTROS/$per_page);
y la página actual es $página_actual, la paginación se llamaría así:
1
2
3
4
5
6
7
8
9
10
<?php
...
include_once("funciones.php"); // Carga las funciones
...
// Aquí se calcula $Total_paginas
..
// Aquí se muestra la página
...
paginacion(3,2,$pagina_actual,4,1,$Total_paginas);
...
Los enlaces los tienes que insertar tu en la linea 7. Por ejemplo:
1
echo " <a href='enlace.php?pagina=$i'>$conjunto[$i]</a>";

Otra cosa, no puedes copiar y pegar sin más ya que el archivo que te he mandado tiene dos partes: las funciones y ejemplos de utilización de las funciones (lineas 84 a 98).

Si tienes más dudas pregunta.

Saludos de Víctor.-
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 34
Ha aumentado su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Paginación de resultados Mysqli

Publicado por Juan Carlos (19 intervenciones) el 15/12/2016 21:16:22
Hola de nuevo Víctor buenas noches. Gracias por las aclaraciones y tu paciencia…

He seguido tus indicaciones y efectivamente ya muestra la paginación, pero no lo hace de forma correcta.

Te explico:

El enlace lo genero tal y como me has indicado:
1
<?php paginacion(3,2,$Pagina,4,1,$Total_paginas);?>

Cogiendo el valor de la página actual “$Pagina” y calculando el total de páginas “$Total_paginas” que en este caso son 21.

Y aparece la siguiente paginación (que es correcta la forma de mostrarla):

1 2 3 … 8 9 10 11 12 13 14… 21

Aclarar que estoy en www.dominio.com/noticia.php?Pagina=10 y da como resultado la paginación indicada anteriormente:

Pero los enlaces no se generan correctamente y lo hacen de la siguiente forma errónea:
- El 1 apunta a nombre.php?Pagina=0 (debería ser al 1)
- El 2 apunta a nombre.php?Pagina=1 (debería ser al 2)
- El 3 apunta a nombre.php?Pagina=2 (debería ser al 3)

- El 8 apunta a nombre.php?Pagina=4 (debería ser al 8)
- El 9 apunta a nombre.php?Pagina=5 (debería ser al 9)
….
- El 14 apunta a nombre.php?Pagina=10 (debería ser al 14)

Y por último,
- El 21 apunta a nombre.php?Pagina=12 (debería ser al 21)

No sé si me he explicado bien...

Un saludo y mil gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de VRM
Val: 152
Ha disminuido su posición en 6 puestos en PHP (en relación al último mes)
Gráfica de PHP

Paginación de resultados Mysqli

Publicado por VRM (192 intervenciones) el 19/12/2016 19:05:17
Hola: siento no haberte podido contestarte antes.

Es cierto lo que dices, $i es el índice del conjunto que se muestra. En la función muestra el parámetro $conjunto, para el ejemplo que puse es:
$conjunto[0] = 1
$conjunto[1] = 2
$conjunto[2] = 3
$conjunto[3] = "..."
$conjunto[4] = 8
$conjunto[5] = 9
$conjunto[6] = 10
$conjunto[7] = 11
$conjunto[8] = 12
$conjunto[9] = 13
$conjunto[10] = 14
$conjunto[11] = "..."
$conjunto[12] = 21
Y los enlaces deberían ser:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
------------------------------------------------
     Para $i =   |  enlace                     |
------------------------------------------------
          0      |  enlace.php?Pagina=1        |
          1      |  enlace.php?Pagina=2        |
          2      |  enlace.php?Pagina=3        |
          3      |       no hay enlace         |
          4      |  enlace.php?Pagina=8        |
          5      |  enlace.php?Pagina=9        |
          6      |  enlace.php?Pagina=10       |
          7      |  enlace.php?Pagina=11       |
          8      |  enlace.php?Pagina=12       |
          9      |  enlace.php?Pagina=13       |
         10      |  enlace.php?Pagina=14       |
         11      |       no hay enlace         |
         12      |  enlace.php?Pagina=21       |
-------------------------------------------------
Si cambias la linea 7 por:
1
echo " <a href='enlace.php?pagina=".$conjunto[$i]."'>$conjunto[$i]</a>";
Te saldrá donde pone 1 el enlace será a enlace.php?pagina=1, etc.

Disculpa el lapsus.

Saludos de Víctor.-
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 34
Ha aumentado su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Paginación de resultados Mysqli

Publicado por Juan Carlos (19 intervenciones) el 20/12/2016 11:33:29
Hola Víctor muy buenos días. Ahora va perfecto!!!

Te estoy muy agradecido por el tiempo que me has dedicado y tus respuestas tan claras y precisas.

Cualquier cosa que pueda hacer por ti, no dudes en decírmelo.

Mil gracias!!

Un abrazo.

Juan Carlos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de VRM
Val: 152
Ha disminuido su posición en 6 puestos en PHP (en relación al último mes)
Gráfica de PHP

Paginación de resultados Mysqli

Publicado por VRM (192 intervenciones) el 21/12/2016 10:26:28
No hay de qué.

A tu disposición.

Saludos de Víctor.-
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar