Blog de programación, errores, soluciones

Chose Language:
Author: Admin/Publisher |finished | checked

Paginación en PHP

Ya era hora de tocar el tema de la paginación en PHP; Este post se tratará más de tocar los fundamentos de como se hace una paginación en un lenguaje de programación.

Introducción

Si es muy nuevo en lo que es internet se preguntara ¿A qué le llamamos paginación en una web?

La paginación es una manera de mostrar un resultado de una búsqueda o información en varias páginas.

Comencemos con un array

Array de nombres
$nombres_completos = [
"Juan Pérez",
"María Rodríguez",
"Luis García",
"Ana Martínez",
"Carlos López",
"Laura González",
"Pedro Sánchez",
"Isabel Fernández",
"Miguel Torres",
"Sofía Ramírez",
"Diego Morales",
"Elena Ruiz",
"Andrés Castro",
"Carmen Vargas",
"Alejandro Herrera",
"Raquel Ortega",
"Javier Cruz",
"Valentina Paredes",
"José Ramón Mendoza",
"Patricia Jiménez",
"Felipe Aguilar",
"Lucía Castro",
"Roberto Medina",
"Adriana Silva",
"Daniel Molina",
"Natalia Pérez",
"Manuel López",
"Carolina Ruiz",
"Héctor Torres",
"Rocío Soto",
"Fernando Navarro",
"Isabella Gómez",
"Antonio González",
"Alicia Ríos",
"Gustavo Romero",
"Catalina Herrera",
"Pablo Fernández",
"Valeria López",
"Ricardo Díaz",
"Gabriela Morales",
"José Luis Martínez",
"Paula García",
"Juan Carlos Ramírez",
"Marina Ortiz",
"Roberto Vargas",
"Camila Castro",
"Ernesto Pérez",
"Diana Torres",
"Andrés Medina",
"Alejandra Sánchez"
];

Este array si mal no recuerdo tiene 50 nombres aleatorios.

Datos por página

¿Cómo haríamos para mostrar 5 nombres por página? Podríamos hacer algo como lo que sigue utilizando la función de PHP array_chunk

$data_per_page = 5;
$narray = array_chunk($nombres_completos,$data_per_page);

Ahora tendríamos 10 arrays de 5 elementos, por lo tanto, serían 10 páginas en la que mi información será mostrada.

¿Cómo haría la numeración para estas 10 páginas?

$page_num = 0;
for ($n = 0; $n < count($narray) ; $n++){
	$page_num = $page_num + 1;
	echo $page_num;
}

Contenido de Posición actual

Ahora tendríamos la numeración de nuestras páginas del 1 a 10, ¿qué otra cosa necesitaríamos? Necesitaríamos la página que actualmente estamos, aquí puede confundirse debido a que estamos utilizando array_chunk y, por lo tanto, estamos hablando de arrays que están dentro del nuestro $narray

Mi primera página es 1 en consecuencia para recorrer mi primer array debería hacer esto:

$actual_page=1;
foreach ($narray[$actual_page -1] as $element) {
	echo "<p>$element</p>";
}

Usando $_GET

Algo que tenemos que tener en cuenta es que nuestra página actual no siempre será 1 en consecuencia tenemos que controlar eso, algo que podemos hacer es utilizar $_GET con isset

if (isset($_GET["page"])) {
	$actual_page =$_GET["page"];
}

De esta manera, si hacemos http://localhost/tutorialphp/pagination/?page=3 obtendremos la data de la página 3.

Ya solo nos quedaría hacer que en nuestra numeración tengamos los links:

for ($n = 0; $n < count($narray) ; $n++) {
	$page_num = $page_num + 1;
	$link = "/tutorialphp/pagination/?page=".$page_num;
	echo "<a href=$link>".$page_num."</a>";
}

Tengamos en cuenta que yo no estoy usando un virtual host para que quede similar a un proyecto en producción, el path del link es el path que tengo de la carpeta donde hago este tutorial para el que lo quiera leer, si usted desea probar el código deberá hacerlo según la ruta en su PC.

¿Porque estamos utilizando array_chunk?

Porque chunk es una muy buena herramienta, para el control de cuanta data devolveremos. Si te estas pensando porque no estamos usando uana consulta SQL con limit? tambien tienes razon, tenemos que controlar cuanta data traemos.

Pero que pasa si tubieramos muchos usuarios supongamos 1.000.000 al mismo tiempo o somos una pagina de lectura online o de peliculas online etc; que pose un flujo muy grande de usuario pasando de paginas?

En mi forma de ver no deberiamos de estar llamando a la base de datos por cada pagina sino llamar una cantidad pertinente en la consulta y luego con array_chunk tratarla.

Paginación con SQL

Veamos si ha quedado algo de lo que vimos anteriormente, para este ejercicio haremos una tabla en una base de datos con los datos suficientes.

Créate una base de datos en tu XAMPP, WAMP o servidor local que tengas.

Añade la siguiente tabla corriendo el código en la pestaña de SQL

Este script SQL crea una tabla usuarios en una base de datos seleccionada y la llena
CREATE TABLE usuarios (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(50),
apellido VARCHAR(50),
email VARCHAR(100)
);
INSERT INTO usuarios (nombre, apellido, email) VALUES
("Abby Reichel","Klein","connelly.tania@rippin.info"),
("Vinnie Shields MD","McGlynn","helen.thompson@oconner.com"),
("Toy Rau","Lueilwitz","jstiedemann@hartmann.org"),
("Marge Mohr","Gleason","shields.molly@gmail.com"),
("Devin Sanford","McClure","bogisich.susan@langosh.com"),
("Prof. Nico Luettgen IV","Pacocha","zhaley@predovic.com"),
("Ms. Meta Kuvalis I","Cronin","anna.mayer@west.com"),
("Dr. Jerald Maggio","Collins","eveline51@moen.com"),
("Sydnie Hessel","Wehner","carolyn.huel@wyman.com"),
("Josianne Purdy","Altenwerth","klein.tiara@orn.info"),
("Mrs. Kacie Harvey","Raynor","conn.dorothy@kiehn.com"),
("Eduardo Steuber","Kirlin","verna.hackett@homenick.com"),
("Arnaldo Wyman","Funk","gibson.kaylee@gmail.com"),
("Marco Russel DDS","Crist","celestino.bauch@hotmail.com"),
("Alexanne Bins","Tremblay","fnitzsche@gmail.com"),
("Ayana Hintz","Bergnaum","lorine.miller@muller.biz"),
("Amara Strosin I","Hahn","bstamm@aufderhar.biz"),
("Mrs. Abbey Gulgowski Sr.","Reichel","mgreenholt@gmail.com"),
("Kaden Cormier","Cruickshank","eturner@gmail.com"),
("Stacey Gutmann","Gutkowski","zoe85@gmail.com"),
("Asha Lakin","Green","hilma.eichmann@gmail.com"),
("Prof. Hal Beier","Funk","filiberto.torp@gmail.com"),
("Prof. Sterling Pacocha I","Keeling","qjenkins@gmail.com"),
("Reggie Reichert","Stehr","schmidt.marlene@gmail.com"),
("Elody Stracke","Kihn","pemard@gmail.com"),
("Aniyah Roberts DDS","Wiegand","juliet18@feest.com"),
("Maia Miller","Cronin","abernathy.stanton@gmail.com"),
("Davonte Hegmann","Bechtelar","kennith.abernathy@yahoo.com"),
("Vince Hayes II","Romaguera","ralph.hand@yahoo.com"),
("Rogers Kreiger","Stanton","willms.darryl@gmail.com"),
("Maya Waters","Lockman","ephraim.hudson@waters.net"),
("Gerda Wiza","Schinner","scotty.hermann@lehner.info"),
("Brian Fadel","Ullrich","hartmann.dereck@leffler.com"),
("Hattie Stamm","Braun","ugoodwin@west.net"),
("Carlee Maggio Jr.","Mueller","willms.friedrich@yahoo.com"),
("Bell Smitham PhD","Schuster","khessel@gmail.com"),
("Eleonore Emard","Anderson","gerhold.brooklyn@collier.biz"),
("Merlin Buckridge","McKenzie","maggio.candido@kassulke.info"),
("Melyssa Stamm DDS","Spencer","nettie.rohan@yahoo.com"),
("Dr. Corine Trantow MD","Stamm","uyost@gmail.com"),
("Dortha Johnston","Zulauf","leonie.koelpin@schinner.net"),
("Prof. Edmond Mitchell","Kris","thad.koepp@tillman.com"),
("Viviane Strosin","Hettinger","marcus11@rohan.com"),
("Santina Mertz","White","muller.brooke@marvin.biz"),
("Walton Steuber","Runte","emilia.kshlerin@hotmail.com"),
("Alexanne Cronin","Rolfson","murphy.jaron@streich.biz"),
("Otho VonRueden","Kozey","legros.dereck@rolfson.com"),
("Nestor Schoen V","Kilback","mann.sammie@johnson.com"),
("Amie Schmeler","Kris","billie30@nienow.org"),
("Heloise Hansen","Homenick","gusikowski.carlos@yahoo.com"),
("Jerod Nolan","Swaniawski","lemke.eliezer@labadie.com"),
("Pinkie McGlynn V","Hagenes","welch.briana@oreilly.com"),
("Bertrand Kuhn","Wilkinson","obednar@wilderman.biz"),
("Garrick Nader","McLaughlin","hartmann.louie@gmail.com"),
("Dr. Kiley Hickle","Jaskolski","katelyn.reichert@hotmail.com"),
("Gussie Nolan","Armstrong","sean56@yahoo.com"),
("Sister Frami","Beer","darwin.spencer@gmail.com"),
("Mrs. Macie Metz Sr.","Wilkinson","bonita12@yahoo.com"),
("Dr. Tressa Beatty","Kreiger","brennan.ward@yahoo.com"),
("Keaton Moen","O'Conner","carroll.hansen@gmail.com"),
("Dr. Dante Kemmer Sr.","Prosacco","reuben77@hotmail.com"),
("Prof. Maxime Donnelly","Rodriguez","earnest.brown@gmail.com"),
("Antonio Jones DVM","Rutherford","lynch.elmo@stokes.com"),
("Jacky Purdy","Weimann","brain70@reilly.com"),
("Dr. Anne Terry DDS","West","ocrona@yahoo.com"),
("Moses Glover DVM","Smith","auer.zoe@yahoo.com"),
("Prof. Amara Collier III","Gulgowski","runte.richmond@walsh.com"),
("Preston Schimmel II","Klein","josue.reilly@yahoo.com"),
("Jaleel Grimes DDS","Crona","perry.ward@gmail.com"),
("Viviane Runolfsdottir I","Cassin","crona.trisha@stroman.biz"),
("Brooke Walker","Hammes","feeney.idella@yahoo.com"),
("Scottie Gutkowski","Lemke","rasheed25@yahoo.com"),
("Alexys Stiedemann PhD","Hickle","alexanne.williamson@gmail.com"),
("Mr. Rodolfo Dach","Gerlach","sschowalter@mann.com"),
("Gussie Baumbach","Murphy","hassie22@yahoo.com"),
("Roel Walsh","Huels","camren.fritsch@hane.com"),
("Sammy Gulgowski","Cremin","king.gudrun@spencer.biz"),
("Cesar Dooley","Conroy","xwillms@tromp.com"),
("Ms. Ottilie Schaden","Wilderman","alexandre81@smith.com"),
("Una Powlowski MD","Kulas","susan07@yahoo.com"),
("Stephania Wolff","Crona","ulices.ritchie@hudson.info"),
("Creola Kilback","Becker","bmueller@gmail.com"),
("Arnulfo Dietrich","Goyette","ngottlieb@kub.com"),
("Ms. Zaria Zboncak","Rohan","fay.emory@stanton.com"),
("Dr. Litzy Hahn PhD","Rodriguez","pokuneva@jast.com"),
("Otha Corwin","Harber","wisozk.michel@sipes.info"),
("Jamir Connelly","Tromp","rrau@kuhlman.com"),
("Jada Shanahan","Franecki","wuckert.sigrid@pfeffer.org"),
("Prof. Ettie Marvin","Konopelski","elvie94@hotmail.com"),
("Juston Stanton","Rempel","ilene28@gmail.com"),
("Maye Lemke","Block","rippin.brando@schultz.com"),
("Sid Upton","Balistreri","jettie.west@goyette.com"),
("Prof. Destany McGlynn","Pagac","isai62@rogahn.com"),
("Prof. Charley Beer I","Ondricka","zhyatt@larson.biz"),
("Amina Donnelly","Ondricka","lmann@yahoo.com"),
("Rasheed Waelchi","Larson","willy.hagenes@yahoo.com"),
("Oda Lindgren","Abernathy","johnathon.mertz@gmail.com"),
("Bartholome Aufderhar IV","Smith","carroll.angelina@padberg.biz"),
("Dino Herzog","Hintz","chyna31@yahoo.com"),
("Conor Kunde","Hegmann","dagmar.stehr@prohaska.com"),
("Marielle Sipes","Lehner","roy.baumbach@gmail.com"),
("Milford Cremin V","Runolfsson","ymoore@kertzmann.com"),
("Dr. Kendrick Marks","Williamson","clare.prosacco@yahoo.com"),
("Maudie King","Pollich","kub.margaret@gmail.com"),
("Annie Dietrich DVM","Stokes","powlowski.daniela@stehr.net"),
("Kyler Medhurst","Strosin","penelope97@hotmail.com"),
("Jordane Lang","Fay","hoppe.delpha@halvorson.com"),
("Cortez Schuppe","Keeling","dlueilwitz@gmail.com"),
("Celia Hansen","Gaylord","hsauer@runolfsson.com"),
("Jillian Runte","Stoltenberg","dibbert.cathy@yahoo.com"),
("Leta Vandervort","Cartwright","damore.frances@torp.com"),
("Heaven McClure DVM","Durgan","alvis77@kreiger.com"),
("Prof. Gaetano Mohr","Reynolds","danial87@carroll.com"),
("Eve Skiles Jr.","Rowe","walsh.devonte@cummings.net"),
("Prof. Delfina Bernhard III","Jacobi","kjakubowski@yahoo.com"),
("Keyshawn Rosenbaum","Schaden","alvera22@hotmail.com"),
("Carolanne Lehner","McGlynn","misael82@tremblay.com"),
("Garret Ebert","Ortiz","trantow.tevin@hotmail.com"),
("Vern Hessel DVM","Kunde","plebsack@yahoo.com"),
("Aiden Donnelly","Powlowski","christopher79@yahoo.com"),
("Prof. Reese Stark II","Corwin","judson.green@williamson.com"),
("Luis Rosenbaum PhD","Roob","gerlach.zechariah@aufderhar.com"),
("Kamron Littel","Bins","tmiller@yahoo.com"),
("Rollin Stroman","Beer","dayne.mann@gmail.com"),
("Mrs. Christa O'Hara MD","Kulas","veum.marques@hotmail.com"),
("Vita Reinger III","Casper","anya67@gmail.com"),
("Prof. Trevor Swift DVM","Hodkiewicz","hettie91@gmail.com"),
("Mr. Craig Marvin III","Towne","konopelski.vincenza@hotmail.com"),
("Bertrand Crist","Funk","rogahn.javon@yahoo.com"),
("Bella Kassulke","Fisher","ferry.zackery@kozey.com"),
("Candelario Feil IV","Schiller","zauer@howe.org"),
("Toby VonRueden III","Schamberger","blick.alverta@hotmail.com"),
("Ms. Ebony Schulist V","Sauer","frank26@hotmail.com"),
("Dr. Peyton Weissnat","Mann","kwilderman@hotmail.com"),
("Wallace Farrell","Cummings","hickle.eduardo@yahoo.com"),
("Demarcus Jenkins","Hagenes","rudolph22@hotmail.com"),
("Tre Schmeler","Ullrich","oreilly.jonathan@white.com"),
("Dr. Josephine Graham DVM","Harvey","shauck@homenick.com"),
("Dr. Kristopher Hirthe Sr.","Metz","bdicki@bogisich.com"),
("Mr. Everett Carter PhD","Hoeger","hartmann.olen@yost.com"),
("Kaya Gleichner","Morar","olson.magdalena@gmail.com"),
("Dr. Gust Stroman","Lowe","karlie.hermiston@mcdermott.com"),
("Alene Goyette","Gleason","skiles.noemi@hotmail.com"),
("Audra Smith","Hirthe","lehner.nicholaus@gmail.com"),
("Aliya Zieme","Pacocha","lera.bahringer@treutel.com"),
("Kade Nader III","Gorczany","lincoln70@deckow.info"),
("Mafalda Ebert","Parker","padberg.nathaniel@bayer.org"),
("Mrs. Maritza Wilderman","Doyle","qwest@gmail.com"),
("Misty Brakus DVM","Gleichner","elaina20@heidenreich.com"),
("Prof. Fanny Hickle II","Deckow","ohara.joey@gmail.com"),
("Yazmin Vandervort","Nicolas","greenholt.colin@yahoo.com");

Esta vez no uses array_chunk trata de hacerlo tal como se haría en un blog común, usa una query de SQL con LIMIT para obtener los datos que quieres por página.

sintaxis de consulta sql
SELECT column_name(s)
FROM table_name
WHERE condition
LIMIT [offset,][rowcount];

Trata de que la numeración para las páginas sea como sigue:

Esto nos permite ver como es una paginación en la realidad tendremos que controlar el número de links en la numeración como máximo entre 10 y 20

[1][2][3][4][5][...][100][101][102][103][104]

Si tengo 1000 números en la numeración no tiene sentido mostrar 1000 links debajo de cada página, tiene más sentido mostrar los próximos 5 o 3 luego ... haciendo referencia a que hay más páginas y los últimos 5 o 3 si tiene dudas acerca de esto ve a una por ejemplo de películas y ve como hace la paginación, luego regresa y trata de emularlo con tu código.

[<][6][7][8][9][...][100][101][102][103][104]

TIPS

Saca la cantidad de usuarios con la siguiente consulta sql:

select count(*) From usuarios
divide la cantidad de usuarios con la cantidad deseada por pagina para saber la cantidad de links que necesitas.

Tendras que guardar el valor del link que estas pidiendo

Utilizando array_chunk y SQL para la paginación

como ejercicio también podrías agregar array_chunk a la ecuación, esta vez deberás tener en cuenta que deberás traer la cantidad de elementos de varias páginas, por ejemplo la de las primeras 5 y de las últimas 5.

Category: php
Something wrong? If you found an error or mistake in the content you can contact me on Twitter | @luisg2249_luis.
Last 4 post in same category