Crear paginación PHP MySQL

Crear paginación PHP MySQL es muy simple usando PHP PDO con MySQL. Usaremos MVC para paginación con PHP y MariaDB o MySQL usando PDO.
Usaremos 3 archivo para implementar una paginación en los proyectos web desarrollados en el lenguaje PHP. Además, para lograr la implementación es necesario ajustar solo ciertos parámetros.
Crear paginación PHP MySQL
Vamos a paginar los datos de la tabla (países), también agregaremos enlaces para que nos sitúe en un determinado número de página, numerar los resultados en páginas y saber cuántas páginas debe de tener.
Que recursos necesitamos para crear paginación en PHP
Necesitaremos los siguientes recursos para que nuestro buscador funcione correctamente y además nos apoyaremos en una vista, controlador y un modelo.
- Lenguaje PHP
- HTML5
- Framework Bootstrap 4.6
- Base de datos MySQL
Tabla y registros MySQL
Para que nuestro paginado de resultados se pueda apreciar al 100% necesitamos una tabla en MySQL con sus respectivos registros. Por lo tanto, vamos a usar una tabla de países.
La estructura, creación de la tabla y poblar con datos lo tenemos en las siguientes líneas de código que vendría a ser nuestra fuente de datos para este ejemplo.
CREATE TABLE `paises` (
`id` int(11) NOT NULL,
`iso` char(2) DEFAULT NULL,
`nombre` varchar(80) DEFAULT NULL,
`fecha` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `paises` (`id`, `iso`, `nombre`, `fecha`) VALUES
(1, 'AF', 'Afganistán', '2023-03-25 03:01:50'),
(2, 'AX', 'Islas Gland', '2023-03-25 03:01:50'),
(3, 'AL', 'Albania', '2023-03-25 03:01:50'),
(4, 'DE', 'Alemania', '2023-03-25 03:01:50'),
(5, 'AD', 'Andorra', '2023-03-25 03:01:50'),
(6, 'AO', 'Angola', '2023-03-25 03:01:50'),
(7, 'AI', 'Anguilla', '2023-03-25 03:01:50'),
(8, 'AQ', 'Antártida', '2023-03-25 03:01:50'),
(9, 'AG', 'Antigua y Barbuda', '2023-03-25 03:01:50'),
(10, 'AN', 'Antillas Holandesas', '2023-03-25 03:01:50'),
(11, 'SA', 'Arabia Saudí', '2023-03-25 03:01:50'),
(12, 'DZ', 'Argelia', '2023-03-25 03:01:50'),
(13, 'AR', 'Argentina', '2023-03-25 03:01:50'),
(14, 'AM', 'Armenia', '2023-03-25 03:01:50'),
(15, 'AW', 'Aruba', '2023-03-25 03:01:50'),
(16, 'AU', 'Australia', '2023-03-25 03:01:50'),
(17, 'AT', 'Austria', '2023-03-25 03:01:50'),
(18, 'AZ', 'Azerbaiyán', '2023-03-25 03:01:50'),
(19, 'BS', 'Bahamas', '2023-03-25 03:01:50'),
(20, 'BH', 'Bahréin', '2023-03-25 03:01:50'),
(21, 'BD', 'Bangladesh', '2023-03-25 03:01:50'),
(22, 'BB', 'Barbados', '2023-03-25 03:01:50'),
(23, 'BY', 'Bielorrusia', '2023-03-25 03:01:50'),
(24, 'BE', 'Bélgica', '2023-03-25 03:01:50'),
(25, 'BZ', 'Belice', '2023-03-25 03:01:50'),
(26, 'BJ', 'Benin', '2023-03-25 03:01:50'),
(27, 'BM', 'Bermudas', '2023-03-25 03:01:50'),
(28, 'BT', 'Bhután', '2023-03-25 03:01:50'),
(29, 'BO', 'Bolivia', '2023-03-25 03:01:50'),
(30, 'BA', 'Bosnia y Herzegovina', '2023-03-25 03:01:50'),
(31, 'BW', 'Botsuana', '2023-03-25 03:01:50'),
(32, 'BV', 'Isla Bouvet', '2023-03-25 03:01:50'),
(33, 'BR', 'Brasil', '2023-03-25 03:01:50'),
(34, 'BN', 'Brunéi', '2023-03-25 03:01:50'),
(35, 'BG', 'Bulgaria', '2023-03-25 03:01:50'),
(36, 'BF', 'Burkina Faso', '2023-03-25 03:01:50'),
(37, 'BI', 'Burundi', '2023-03-25 03:01:50'),
(38, 'CV', 'Cabo Verde', '2023-03-25 03:01:50'),
(39, 'KY', 'Islas Caimán', '2023-03-25 03:01:50'),
(40, 'KH', 'Camboya', '2023-03-25 03:01:50'),
(41, 'CM', 'Camerún', '2023-03-25 03:01:50'),
(42, 'CA', 'Canadá', '2023-03-25 03:01:50'),
(43, 'CF', 'República Centroafricana', '2023-03-25 03:01:50'),
(44, 'TD', 'Chad', '2023-03-25 03:01:50'),
(45, 'CZ', 'República Checa', '2023-03-25 03:01:50'),
(46, 'CL', 'Chile', '2023-03-25 03:01:50'),
(47, 'CN', 'China', '2023-03-25 03:01:50'),
(48, 'CY', 'Chipre', '2023-03-25 03:01:50'),
(49, 'CX', 'Isla de Navidad', '2023-03-25 03:01:50'),
(50, 'VA', 'Ciudad del Vaticano', '2023-03-25 03:01:50'),
(51, 'CC', 'Islas Cocos', '2023-03-25 03:01:50'),
(52, 'CO', 'Colombia', '2023-03-25 03:01:50'),
(53, 'KM', 'Comoras', '2023-03-25 03:01:50'),
(54, 'CD', 'República Democrática del Congo', '2023-03-25 03:01:50'),
(55, 'CG', 'Congo', '2023-03-25 03:01:50'),
(56, 'CK', 'Islas Cook', '2023-03-25 03:01:50'),
(57, 'KP', 'Corea del Norte', '2023-03-25 03:01:50'),
(58, 'KR', 'Corea del Sur', '2023-03-25 03:01:50'),
(59, 'CI', 'Costa de Marfil', '2023-03-25 03:01:50'),
(60, 'CR', 'Costa Rica', '2023-03-25 03:01:50'),
(61, 'HR', 'Croacia', '2023-03-25 03:01:50'),
(62, 'CU', 'Cuba', '2023-03-25 03:01:50'),
(63, 'DK', 'Dinamarca', '2023-03-25 03:01:50'),
(64, 'DM', 'Dominica', '2023-03-25 03:01:50'),
(65, 'DO', 'República Dominicana', '2023-03-25 03:01:50'),
(66, 'EC', 'Ecuador', '2023-03-25 03:01:50'),
(67, 'EG', 'Egipto', '2023-03-25 03:01:50'),
(68, 'SV', 'El Salvador', '2023-03-25 03:01:50'),
(69, 'AE', 'Emiratos Árabes Unidos', '2023-03-25 03:01:50'),
(70, 'ER', 'Eritrea', '2023-03-25 03:01:50'),
(71, 'SK', 'Eslovaquia', '2023-03-25 03:01:50'),
(72, 'SI', 'Eslovenia', '2023-03-25 03:01:50'),
(73, 'ES', 'España', '2023-03-25 03:01:50'),
(74, 'UM', 'Islas ultramarinas de Estados Unidos', '2023-03-25 03:01:50'),
(75, 'US', 'Estados Unidos', '2023-03-25 03:01:50'),
(76, 'EE', 'Estonia', '2023-03-25 03:01:50'),
(77, 'ET', 'Etiopía', '2023-03-25 03:01:50'),
(78, 'FO', 'Islas Feroe', '2023-03-25 03:01:50'),
(79, 'PH', 'Filipinas', '2023-03-25 03:01:50'),
(80, 'FI', 'Finlandia', '2023-03-25 03:01:50'),
(81, 'FJ', 'Fiyi', '2023-03-25 03:01:50'),
(82, 'FR', 'Francia', '2023-03-25 03:01:50'),
(83, 'GA', 'Gabón', '2023-03-25 03:01:50'),
(84, 'GM', 'Gambia', '2023-03-25 03:01:50'),
(85, 'GE', 'Georgia', '2023-03-25 03:01:50'),
(86, 'GS', 'Islas Georgias del Sur y Sandwich del Sur', '2023-03-25 03:01:50'),
(87, 'GH', 'Ghana', '2023-03-25 03:01:50'),
(88, 'GI', 'Gibraltar', '2023-03-25 03:01:50'),
(89, 'GD', 'Granada', '2023-03-25 03:01:50'),
(90, 'GR', 'Grecia', '2023-03-25 03:01:50'),
(91, 'GL', 'Groenlandia', '2023-03-25 03:01:50'),
(92, 'GP', 'Guadalupe', '2023-03-25 03:01:50'),
(93, 'GU', 'Guam', '2023-03-25 03:01:50'),
(94, 'GT', 'Guatemala', '2023-03-25 03:01:50'),
(95, 'GF', 'Guayana Francesa', '2023-03-25 03:01:50'),
(96, 'GN', 'Guinea', '2023-03-25 03:01:50'),
(97, 'GQ', 'Guinea Ecuatorial', '2023-03-25 03:01:50'),
(98, 'GW', 'Guinea-Bissau', '2023-03-25 03:01:50'),
(99, 'GY', 'Guyana', '2023-03-25 03:01:50'),
(100, 'HT', 'Haití', '2023-03-25 03:01:50'),
(101, 'HM', 'Islas Heard y McDonald', '2023-03-25 03:01:50'),
(102, 'HN', 'Honduras', '2023-03-25 03:01:50'),
(103, 'HK', 'Hong Kong', '2023-03-25 03:01:50'),
(104, 'HU', 'Hungría', '2023-03-25 03:01:50'),
(105, 'IN', 'India', '2023-03-25 03:01:50'),
(106, 'ID', 'Indonesia', '2023-03-25 03:01:50'),
(107, 'IR', 'Irán', '2023-03-25 03:01:50'),
(108, 'IQ', 'Iraq', '2023-03-25 03:01:50'),
(109, 'IE', 'Irlanda', '2023-03-25 03:01:50'),
(110, 'IS', 'Islandia', '2023-03-25 03:01:50'),
(111, 'IL', 'Israel', '2023-03-25 03:01:50'),
(112, 'IT', 'Italia', '2023-03-25 03:01:50'),
(113, 'JM', 'Jamaica', '2023-03-25 03:01:50'),
(114, 'JP', 'Japón', '2023-03-25 03:01:50'),
(115, 'JO', 'Jordania', '2023-03-25 03:01:50'),
(116, 'KZ', 'Kazajstán', '2023-03-25 03:01:50'),
(117, 'KE', 'Kenia', '2023-03-25 03:01:50'),
(118, 'KG', 'Kirguistán', '2023-03-25 03:01:50'),
(119, 'KI', 'Kiribati', '2023-03-25 03:01:50'),
(120, 'KW', 'Kuwait', '2023-03-25 03:01:50'),
(121, 'LA', 'Laos', '2023-03-25 03:01:50'),
(122, 'LS', 'Lesotho', '2023-03-25 03:01:50'),
(123, 'LV', 'Letonia', '2023-03-25 03:01:50'),
(124, 'LB', 'Líbano', '2023-03-25 03:01:50'),
(125, 'LR', 'Liberia', '2023-03-25 03:01:50'),
(126, 'LY', 'Libia', '2023-03-25 03:01:50'),
(127, 'LI', 'Liechtenstein', '2023-03-25 03:01:50'),
(128, 'LT', 'Lituania', '2023-03-25 03:01:50'),
(129, 'LU', 'Luxemburgo', '2023-03-25 03:01:50'),
(130, 'MO', 'Macao', '2023-03-25 03:01:50'),
(131, 'MK', 'ARY Macedonia', '2023-03-25 03:01:50'),
(132, 'MG', 'Madagascar', '2023-03-25 03:01:50'),
(133, 'MY', 'Malasia', '2023-03-25 03:01:50'),
(134, 'MW', 'Malawi', '2023-03-25 03:01:50'),
(135, 'MV', 'Maldivas', '2023-03-25 03:01:50'),
(136, 'ML', 'Malí', '2023-03-25 03:01:50'),
(137, 'MT', 'Malta', '2023-03-25 03:01:50'),
(138, 'FK', 'Islas Malvinas', '2023-03-25 03:01:50'),
(139, 'MP', 'Islas Marianas del Norte', '2023-03-25 03:01:50'),
(140, 'MA', 'Marruecos', '2023-03-25 03:01:50'),
(141, 'MH', 'Islas Marshall', '2023-03-25 03:01:50'),
(142, 'MQ', 'Martinica', '2023-03-25 03:01:50'),
(143, 'MU', 'Mauricio', '2023-03-25 03:01:50'),
(144, 'MR', 'Mauritania', '2023-03-25 03:01:50'),
(145, 'YT', 'Mayotte', '2023-03-25 03:01:50'),
(146, 'MX', 'México', '2023-03-25 03:01:50'),
(147, 'FM', 'Micronesia', '2023-03-25 03:01:50'),
(148, 'MD', 'Moldavia', '2023-03-25 03:01:50'),
(149, 'MC', 'Mónaco', '2023-03-25 03:01:50'),
(150, 'MN', 'Mongolia', '2023-03-25 03:01:50'),
(151, 'MS', 'Montserrat', '2023-03-25 03:01:50'),
(152, 'MZ', 'Mozambique', '2023-03-25 03:01:50'),
(153, 'MM', 'Myanmar', '2023-03-25 03:01:50'),
(154, 'NA', 'Namibia', '2023-03-25 03:01:50'),
(155, 'NR', 'Nauru', '2023-03-25 03:01:50'),
(156, 'NP', 'Nepal', '2023-03-25 03:01:50'),
(157, 'NI', 'Nicaragua', '2023-03-25 03:01:50'),
(158, 'NE', 'Níger', '2023-03-25 03:01:50'),
(159, 'NG', 'Nigeria', '2023-03-25 03:01:50'),
(160, 'NU', 'Niue', '2023-03-25 03:01:50'),
(161, 'NF', 'Isla Norfolk', '2023-03-25 03:01:50'),
(162, 'NO', 'Noruega', '2023-03-25 03:01:50'),
(163, 'NC', 'Nueva Caledonia', '2023-03-25 03:01:50'),
(164, 'NZ', 'Nueva Zelanda', '2023-03-25 03:01:50'),
(165, 'OM', 'Omán', '2023-03-25 03:01:50'),
(166, 'NL', 'Países Bajos', '2023-03-25 03:01:50'),
(167, 'PK', 'Pakistán', '2023-03-25 03:01:50'),
(168, 'PW', 'Palau', '2023-03-25 03:01:50'),
(169, 'PS', 'Palestina', '2023-03-25 03:01:50'),
(170, 'PA', 'Panamá', '2023-03-25 03:01:50'),
(171, 'PG', 'Papúa Nueva Guinea', '2023-03-25 03:01:50'),
(172, 'PY', 'Paraguay', '2023-03-25 03:01:50'),
(173, 'PE', 'Perú', '2023-03-25 03:01:50'),
(174, 'PN', 'Islas Pitcairn', '2023-03-25 03:01:50'),
(175, 'PF', 'Polinesia Francesa', '2023-03-25 03:01:50'),
(176, 'PL', 'Polonia', '2023-03-25 03:01:50'),
(177, 'PT', 'Portugal', '2023-03-25 03:01:50'),
(178, 'PR', 'Puerto Rico', '2023-03-25 03:01:50'),
(179, 'QA', 'Qatar', '2023-03-25 03:01:50'),
(180, 'GB', 'Reino Unido', '2023-03-25 03:01:50'),
(181, 'RE', 'Reunión', '2023-03-25 03:01:50'),
(182, 'RW', 'Ruanda', '2023-03-25 03:01:50'),
(183, 'RO', 'Rumania', '2023-03-25 03:01:50'),
(184, 'RU', 'Rusia', '2023-03-25 03:01:50'),
(185, 'EH', 'Sahara Occidental', '2023-03-25 03:01:50'),
(186, 'SB', 'Islas Salomón', '2023-03-25 03:01:50'),
(187, 'WS', 'Samoa', '2023-03-25 03:01:50'),
(188, 'AS', 'Samoa Americana', '2023-03-25 03:01:50'),
(189, 'KN', 'San Cristóbal y Nevis', '2023-03-25 03:01:50'),
(190, 'SM', 'San Marino', '2023-03-25 03:01:50'),
(191, 'PM', 'San Pedro y Miquelón', '2023-03-25 03:01:50'),
(192, 'VC', 'San Vicente y las Granadinas', '2023-03-25 03:01:50'),
(193, 'SH', 'Santa Helena', '2023-03-25 03:01:50'),
(194, 'LC', 'Santa Lucía', '2023-03-25 03:01:50'),
(195, 'ST', 'Santo Tomé y Príncipe', '2023-03-25 03:01:50'),
(196, 'SN', 'Senegal', '2023-03-25 03:01:50'),
(197, 'CS', 'Serbia y Montenegro', '2023-03-25 03:01:50'),
(198, 'SC', 'Seychelles', '2023-03-25 03:01:50'),
(199, 'SL', 'Sierra Leona', '2023-03-25 03:01:50'),
(200, 'SG', 'Singapur', '2023-03-25 03:01:50'),
(201, 'SY', 'Siria', '2023-03-25 03:01:50'),
(202, 'SO', 'Somalia', '2023-03-25 03:01:50'),
(203, 'LK', 'Sri Lanka', '2023-03-25 03:01:50'),
(204, 'SZ', 'Suazilandia', '2023-03-25 03:01:50'),
(205, 'ZA', 'Sudáfrica', '2023-03-25 03:01:50'),
(206, 'SD', 'Sudán', '2023-03-25 03:01:50'),
(207, 'SE', 'Suecia', '2023-03-25 03:01:50'),
(208, 'CH', 'Suiza', '2023-03-25 03:01:50'),
(209, 'SR', 'Surinam', '2023-03-25 03:01:50'),
(210, 'SJ', 'Svalbard y Jan Mayen', '2023-03-25 03:01:50'),
(211, 'TH', 'Tailandia', '2023-03-25 03:01:50'),
(212, 'TW', 'Taiwán', '2023-03-25 03:01:50'),
(213, 'TZ', 'Tanzania', '2023-03-25 03:01:50'),
(214, 'TJ', 'Tayikistán', '2023-03-25 03:01:50'),
(215, 'IO', 'Territorio Británico del Océano Índico', '2023-03-25 03:01:50'),
(216, 'TF', 'Territorios Australes Franceses', '2023-03-25 03:01:50'),
(217, 'TL', 'Timor Oriental', '2023-03-25 03:01:50'),
(218, 'TG', 'Togo', '2023-03-25 03:01:50'),
(219, 'TK', 'Tokelau', '2023-03-25 03:01:50'),
(220, 'TO', 'Tonga', '2023-03-25 03:01:50'),
(221, 'TT', 'Trinidad y Tobago', '2023-03-25 03:01:50'),
(222, 'TN', 'Túnez', '2023-03-25 03:01:50'),
(223, 'TC', 'Islas Turcas y Caicos', '2023-03-25 03:01:50'),
(224, 'TM', 'Turkmenistán', '2023-03-25 03:01:50'),
(225, 'TR', 'Turquía', '2023-03-25 03:01:50'),
(226, 'TV', 'Tuvalu', '2023-03-25 03:01:50'),
(227, 'UA', 'Ucrania', '2023-03-25 03:01:50'),
(228, 'UG', 'Uganda', '2023-03-25 03:01:50'),
(229, 'UY', 'Uruguay', '2023-03-25 03:01:50'),
(230, 'UZ', 'Uzbekistán', '2023-03-25 03:01:50'),
(231, 'VU', 'Vanuatu', '2023-03-25 03:01:50'),
(232, 'VE', 'Venezuela', '2023-03-25 03:01:50'),
(233, 'VN', 'Vietnam', '2023-03-25 03:01:50'),
(234, 'VG', 'Islas Vírgenes Británicas', '2023-03-25 03:01:50'),
(235, 'VI', 'Islas Vírgenes de los Estados Unidos', '2023-03-25 03:01:50'),
(236, 'WF', 'Wallis y Futuna', '2023-03-25 03:01:50'),
(237, 'YE', 'Yemen', '2023-03-25 03:01:50'),
(238, 'DJ', 'Yibuti', '2023-03-25 03:01:50'),
(239, 'ZM', 'Zambia', '2023-03-25 03:01:50'),
(240, 'ZW', 'Zimbabue', '2023-03-25 03:01:50');
ALTER TABLE `paises`
ADD PRIMARY KEY (`id`);
ALTER TABLE `paises`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=241;
Crear conexión PHP a base de datos
El punto más importante seria crear una conexión a BD y usaremos un fichero llamado «conection.php«. Sin embargo, dentro de este archivo crearemos una clase llamado «Conection«.
Para esta conexión usaremos la extensión Objetos de Datos de PHP (PDO) para realizar la conexión con MySQL
<?php
class Conection
{
protected $conection;
function __construct()
{
$user = "root";
$password = "";
$db_name = "paginacion_php";
$host = "localhost";
$conection_info = "mysql:host=$host;dbname=$db_name";
try
{
$this->conection = new PDO($conection_info, $user, $password);
$this->conection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->conection->exec("set character set utf8");
}
catch (Exception $ex)
{
echo "Ocurrió un error. Detalles: " . $ex->getMessage();
exit();
}
}
}
?>
Nota:
El paginador usara este archivo para la conexión y lo vamos a usar para traer los registros. Además, recuerda cambiar las credenciales de acuerdo a su configuración.
Fichero paginacion.php
Este fichero será el encargado de mostrar la tabla HTML con todos los registros y la configuración. Sin embargo, tenemos que definir cuántos elementos vamos a mostrar por página y cantidad de celdas:
<?php $page = (isset($_GET["page"])) ? $_GET["page"] : 1; ?>
<?php Pagination::config($page, 10, "paises", null , 10); ?>
<?php $data = Pagination::data(); ?>
Código completo
<?php require_once "pagination-controller.php"; ?>
<?php $page = (isset($_GET["page"])) ? $_GET["page"] : 1; ?>
<?php Pagination::config($page, 10, "paises", null , 10); ?>
<?php $data = Pagination::data(); ?>
<?php $active = ""; ?>
<?php if ($data["error"]): header("location: ./paginacion.php"); endif;?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<title>Paginación PDO con PHP</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.1.3/dist/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<h3 class="title-table">Estados del mundo</h3>
<table class="table">
<thead>
<tr class="table-primary">
<th>ID</th>
<th>Iso</th>
<th>Nombre Pais</th>
<th>Fecha</th>
</tr>
</thead>
<tbody>
<?php foreach (Pagination::show_rows("id") as $row): ?>
<tr>
<td><?php echo $row["id"]; ?></td>
<td><?php echo $row["iso"]; ?></td>
<td><?php echo $row["nombre"]; ?></td>
<td><?php echo $row["fecha"]; ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<nav aria-label="Page navigation example">
<ul class="pagination">
<?php if ($data["actual-section"] != 1): ?>
<li class="page-item"><a class="page-link" href="paginacion.php?page=1">Inicio</a></li>
<li class="page-item"><a class="page-link" href="paginacion.php?page=<?php echo $data['previous']; ?>">«</a></li>
<?php endif; ?>
<?php for ($i = $data["section-start"]; $i <= $data["section-end"]; $i++): ?>
<?php if ($i > $data["total-pages"]): break; endif; ?>
<?php $active = ($i == $data["this-page"]) ? "active" : ""; ?>
<li class="page-item <?php echo $active; ?>"> <a class="page-link" href="paginacion.php?page=<?php echo $i; ?>"> <?php echo $i; ?> </a> </li>
<?php endfor; ?>
<?php if ($data["actual-section"] != $data["total-sections"]): ?>
<li class="page-item"><a class="page-link" href="paginacion.php?page=<?php echo $data['next']; ?>">»</a></li>
<li class="page-item"><a class="page-link" href="paginacion.php?page=<?php echo $data['total-pages']; ?>">Final</a></li>
<?php endif; ?>
</ul>
</nav>
</div>
</body>
</html>
Controlador de paginador PHP
Usar un controlador es muy recomendado ya que nos apoyamos en una potente arquitectura de programación y el fichero se llamará: pagination-controller.php
<?php
require_once "pagination-model.php";
class Pagination
{
private static $page;
private static $range;
private static $section_size;
private static $pagination_model;
public static function config($page, $range, $table, $custom_select = null, $section_size = 5)
{
self::$page = (string)($page);
self::$range = $range;
self::$section_size = $section_size;
if ($custom_select == null && $table != null)
{
self::$pagination_model = new PaginationModel($table);
}
else
{
self::$pagination_model = new PaginationModel($custom_select, true);
}
}
public static function show_rows($order_by, $sort = "ASC")
{
$page = self::$page;
$range = self::$range;
$pagination_model = self::$pagination_model;
$start = ($page - 1) * $range;
$rows = $pagination_model->get_rows($start, $range, $order_by, $sort);
$names = $pagination_model->get_columns_names();
$result = array(array());
if ($rows != null)
{
for ($i = 0; $i < count($rows); $i++)
{
for ($j = 0; $j < count($names); $j++)
{
$result[$i][$names[$j]] = $rows[$i][$j];
}
}
}
else
{
for ($j = 0; $j < count($names); $j++)
{
$result[0][$names[$j]] = "Error: vacío";
}
}
return $result;
}
public static function data()
{
$page = self::$page;
$range = self::$range;
$section_size = self::$section_size;
$pagination_model = self::$pagination_model;
$actual_section = 1;
$total_rows = $pagination_model->length();
$total_pages = ceil($total_rows / $range);
$total_sections = ceil($total_pages / $section_size);
$section_count = $section_size;
$error = false;
do
{
if ($page > $section_count)
{
$section_count += $section_size;
$actual_section++;
}
}
while($page > $section_count);
$section_end = $actual_section * $section_size;
$section_start = ($section_end - $section_size) + 1;
if ($page > $total_pages || $page <= 0 || !ctype_digit($page))
{
$error = ($total_rows == 0) ? false : true;
}
$pagination_data = array();
$pagination_data["error"] = $error;
$pagination_data["previous"] = $page - 1;
$pagination_data["next"] = $page + 1;
$pagination_data["this-page"] = $page;
$pagination_data["total-pages"] = $total_pages;
$pagination_data["section-start"] = $section_start;
$pagination_data["section-end"] = $section_end;
$pagination_data["actual-section"] = $actual_section;
$pagination_data["total-sections"] = $total_sections;
return $pagination_data;
}
}
?>
Usar modelo en paginador PHP
Sera el encargado de realizar las consultas SQL necesarias para el paginador y para ello incluiremos el archivo de conexion.php.
Tendrá como nombre: pagination-model.php
<?php
require_once "conection.php";
class PaginationModel extends Conection
{
private $query;
public function __construct($query, $custom = false)
{
parent::__construct();
if ($custom)
{
$this->query = $query;
}
else
{
$this->query = "SELECT * FROM " . addslashes($query);
}
}
public function get_rows($start, $range, $order_by, $sort)
{
try
{
$query = $this->query
. " ORDER BY "
. addslashes($order_by) . " "
. addslashes($sort)
. " LIMIT :START, :RANGE";
$query = $this->conection->prepare($query);
$query->bindParam(":START", $start, PDO::PARAM_INT);
$query->bindParam(":RANGE", $range, PDO::PARAM_INT);
$query->execute();
$rows = $query->fetchAll(PDO::FETCH_NUM);
$query->closeCursor();
return $rows;
}
catch (Exception $ex)
{
return null;
}
}
public function get_columns_names()
{
try
{
$query = $this->query;
$query = $this->conection->query($query);
$columns = $query->columnCount();
$result = array();
for ($i = 0; $i < $columns; $i++)
{
$column_info = $query->getColumnMeta($i);
$result[] = $column_info["name"];
}
$query->closeCursor();
return $result;
}
catch (Exception $e)
{
return null;
}
}
public function length()
{
try
{
$query = $this->query;
$query = $this->conection->query($query);
$rows = $query->fetchAll(PDO::FETCH_NUM);
$query->closeCursor();
return count($rows);
}
catch (Exception $e)
{
return null;
}
}
}
?>
Conclusiones de paginación PDO PHP
En el presente ejemplo hemos usado PHP y base de datos para montar un potente script de paginación de resultados.
Como han podido apreciar la implementación es muy simple y les ayudara a implementar en sus proyectos web.