Paginación de Resultados con PHP

Hola amigos, aquí les traigo un script para realizar la paginación de resultados con PHP y MySQL. Casi todos los sitios web que implementan algún tipo de búsqueda deben en algún momento utilizar la paginación de resultados para no arrojar una cantidad desmesurada de datos en una única página. Como se ha visto desde siempre en los buscadores tipo Google, es mucho mejor presentar los resultados en varias páginas distintas y colocar en la parte de abajo una lista de las páginas de resultados que la búsqueda ha encontrado. Pasos previos:

1.- Copiar el fichero paginacion.php en cualquier directorio del servidor web
2.- Crear una base de datos llamado ‘paginacion’ (si es diferente, deberíais cambiar el código)
3.- Cambiar los datos de conexión si son diferentes.
4.- Cargar la siguiente tabla en la base de datos:

CREATE TABLE comercios (
co_id varchar(10) NOT NULL default ”,
co_nombre varchar(30) NOT NULL default ”,
co_pais varchar(30) NOT NULL default ”,
UNIQUE KEY co_id (co_id)
) ;

5.- Realizar los siguientes insert

INSERT INTO comercios VALUES (‘1’, ‘YUNIEL SUAREZ’, ‘CUBA’);
INSERT INTO comercios VALUES (‘2’, ‘JESSICA ROJAS’, ‘CANADA’);
INSERT INTO comercios VALUES (‘3’, ‘JUAN PEREZ’, ‘MEXICO’);
INSERT INTO comercios VALUES (‘4’, ‘ANTONIO RODRIGUEZ’, ‘MEXICO’);
INSERT INTO comercios VALUES (‘5’, ‘INDALECIO TRAVIANNI’, ‘ARGENTINA’);
INSERT INTO comercios VALUES (‘6’, ‘ABELARDO SAINZ’, ‘PERU’);
INSERT INTO comercios VALUES (‘7’, ‘JOSE TOLTACA’, ‘PERU’);
INSERT INTO comercios VALUES (‘8’, ‘RAIMUNDO ALONSO’, ‘ARGENTINA’);
INSERT INTO comercios VALUES (‘9’, ‘JUN JUANES’, ‘BRASIL’);
INSERT INTO comercios VALUES (’10’, ‘JOAO PAMINHIO’, ‘BRASIL’);
INSERT INTO comercios VALUES (’11’, ‘JOAQUIN DIAZ’, ‘CHINA’);

Por supuesto estos datos pueden ser los que queráis, solo sirve de ejemplo.

A continuación el script php paginacion.php escribirlo dentro de los tags <body> </body>

<form id=”paginacion” method=”post” action=””>
<table width=”50%” height=”25%” border=”1″ align=”center” bordercolor=”#FFFFFF” >
<tr>
<td>Comercio Nombre</td>
<td>Comercio Pais</td>
</tr>

<?php
include(‘conect.php’);
//Al principio compruebe si hicieron click en alguna pagina
if(isset($_GET[‘page’])){
$page = $_GET[‘page’];
}
else{
//sino digo que la primera pagina
$page = 1;
}

//Aca se selecciona todos los datos de la pagina
$consulta = “SELECT * FROM comercios”;
$datos = mysql_query($consulta,$idconex);

//Miro cuantos datos fueron devueltos
$num_rows = mysql_num_rows($datos);

//Aqui decido cuantos resultados muestro por pagina
$rows_per_page = 5;

//Calculo la ultima pagina
$lastpage = ceil($num_rows/$rows_per_page);

//Compruebo que el valor de la pagina sea correcta y si es la ultima pagina
$page = (int)$page;
if($page > $lastpage)
{
$page = $lastpage;
}
if($page < 1)
{
$page = 1;
}

//Creo la sentencia limitada para annadir a la consulta que definitiva
$limit = ‘ LIMIT ‘.$rows_per_page.’ OFFSET ‘.($page – 1) * $rows_per_page;

//Realizo la consulta que va a mostrar los datos(es la anterior mas el $limite)
$consulta .= “$limit”;
$resultado = mysql_query($consulta,$idconex);

$cant=mysql_num_rows($resultado);

while($row = mysql_fetch_array($resultado)) {

$nombre=$row[“co_nombre”];
$pais=$row[“co_pais”];
?>

<tr>
<td><?php echo $row[“co_nombre”]?></td>
<td><?php echo $row[“co_pais”]?></td>
</tr>

<?php
}
mysql_free_result($resultado);
?>
</table>

<?php
if($cant == 0)
{
echo ‘No existe ningun comercio’;
}?>

</form>

<?php
//Una vez mostrado los datos tengo que mostrar el bloque de paginacion siempre y cuando haya mas de una pagina
if($num_rows != 0)
{
$nextpage = $page + 1;
$prevpage = $page – 1;

?>

<?php
//Si es la primera desabilito el boton de previous, muestro el 1 como activo y muestro el resto de la pagina
if($page == 1)
{ ?>
&laquo;Anterior
1
<?php
for($i = $page+1;$i <= $lastpage;$i++)
{
?>
<a href=”paginacion.php?page=<?php echo $i; ?>”> <?php echo $i; ?></a>
<?php }
//Y si la ultima es mayor que la actual muestro el boten next o lo desabilito
if($lastpage > $page)
{
?>
<a href=”paginacion.php?page= <?php echo $nextpage; ?> “>Siguiente&raquo;</a>
<?php
}
else{ ?>
Siguiente&raquo;
<?php }
}
else{
//En cambio si no estamos en la pagina 1 habilito el boton de previous y muestro las demas
?>
<a href=”paginacion.php?page=<?php echo $prevpage; ?>” >&laquo;Anterior</a>
<?php
for($i=1;$i <= $lastpage;$i++)
{
//Compruebo si es la pagina activa o no
if($page == $i)
{
?>
<?php echo $i; ?>
<?php }
else{ ?>
<a href=”paginacion.php?page= <?php echo $i; ?> “> <?php echo $i; ?></a>
<?php }
}

//Si no es la ultima pagina activo el boton next
if($lastpage > $page)
{ ?>
<a href=”paginacion.php?page= <?php echo $nextpage; ?>”>Siguiente&raquo;</a>
<?php }
else{ ?>
Siguiente&raquo;
<?php
}
} ?>

<?php } ?>

Aquí la página conexion conect.php no olviden cambiar los valores user, pass si es necesario

<?php
$servidor=’localhost’;
$user=’root’;
$pass=”;
$db=’paginacion’;

if(!($idconex=mysql_connect($servidor,$user,$pass)))
{echo “No se pudo conectar al servidor “.$servidor;}

if(!mysql_select_db($db,$idconex))
{echo “Error de conexion a la base de datos “.$db; exit();}

?>

3 thoughts on “Paginación de Resultados con PHP

  1. estoy tratando d conectarme a un servidor de mysql en otra pc pero me da este error como lo areglo???
    error n o 2003 can ‘t con n ect t o my sql serv er on ’10. 20. 3. 21’ (10060

  2. Muy bueno este blog… Tengo un problema con mysql y php… estoy haciendo en una consulta muchos INSERT ejemplo
    INSERT INTO cosa VALUES(…,…,…);
    INSERT INTO ave VALUES(…,…,…);
    INSERT INTO perro VALUES(…,…,…);

    cuando le doy insertar en mi web.. me da error que no se pudo hacer…. pero si le hago echo al sql y lo copio y despues lo pego en lector de codigo sql de phpmyadmin si me inserta todo normalmente… que sera hermano… ojo.. si hago solo un insert si se lo traga

    1. Renier a lo mejor es algun problema de sintaxis que estas poniendo, a mi me pasa de vez en cuando y despues de tanto probar y probar es un detallito… voy más al grano a ver si te ayudo mira voy pa tí

      En mi servidor cree 3 tablas a, b y c con algunos atributos cada una, aqui esta el código para q las generes en tu phpmyadmin por ejemplo.
      // TABLA A//
      — phpMyAdmin SQL Dump
      — version 4.4.14
      http://www.phpmyadmin.net

      — Servidor: 127.0.0.1
      — Tiempo de generación: 29-01-2016 a las 15:35:22
      — Versión del servidor: 5.6.26
      — Versión de PHP: 5.6.12

      SET SQL_MODE = “NO_AUTO_VALUE_ON_ZERO”;
      SET time_zone = “+00:00”;

      /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
      /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
      /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
      /*!40101 SET NAMES utf8mb4 */;


      — Base de datos: `expediente`

      — ——————————————————–


      — Estructura de tabla para la tabla `a`

      CREATE TABLE IF NOT EXISTS `a` (
      `id` int(4) NOT NULL,
      `nombre` varchar(10) NOT NULL,
      `ci` varchar(11) NOT NULL
      ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;


      — Volcado de datos para la tabla `a`

      INSERT INTO `a` (`id`, `nombre`, `ci`) VALUES
      (1, ‘pepe’, ‘12345678901’);


      — Índices para tablas volcadas


      — Indices de la tabla `a`

      ALTER TABLE `a`
      ADD PRIMARY KEY (`id`);


      — AUTO_INCREMENT de las tablas volcadas


      — AUTO_INCREMENT de la tabla `a`

      ALTER TABLE `a`
      MODIFY `id` int(4) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=3;
      /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
      /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
      /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

      //TABLA B//
      — phpMyAdmin SQL Dump
      — version 4.4.14
      http://www.phpmyadmin.net

      — Servidor: 127.0.0.1
      — Tiempo de generación: 29-01-2016 a las 15:35:28
      — Versión del servidor: 5.6.26
      — Versión de PHP: 5.6.12

      SET SQL_MODE = “NO_AUTO_VALUE_ON_ZERO”;
      SET time_zone = “+00:00”;

      /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
      /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
      /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
      /*!40101 SET NAMES utf8mb4 */;


      — Base de datos: `expediente`

      — ——————————————————–


      — Estructura de tabla para la tabla `b`

      CREATE TABLE IF NOT EXISTS `b` (
      `id` int(4) NOT NULL,
      `sexo` varchar(1) NOT NULL,
      `edad` int(2) NOT NULL
      ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;


      — Volcado de datos para la tabla `b`

      INSERT INTO `b` (`id`, `sexo`, `edad`) VALUES
      (1, ‘M’, 29);


      — Índices para tablas volcadas


      — Indices de la tabla `b`

      ALTER TABLE `b`
      ADD PRIMARY KEY (`id`);


      — AUTO_INCREMENT de las tablas volcadas


      — AUTO_INCREMENT de la tabla `b`

      ALTER TABLE `b`
      MODIFY `id` int(4) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=3;
      /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
      /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
      /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

      //TABLA C//
      — phpMyAdmin SQL Dump
      — version 4.4.14
      http://www.phpmyadmin.net

      — Servidor: 127.0.0.1
      — Tiempo de generación: 29-01-2016 a las 15:35:36
      — Versión del servidor: 5.6.26
      — Versión de PHP: 5.6.12

      SET SQL_MODE = “NO_AUTO_VALUE_ON_ZERO”;
      SET time_zone = “+00:00”;

      /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
      /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
      /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
      /*!40101 SET NAMES utf8mb4 */;


      — Base de datos: `expediente`

      — ——————————————————–


      — Estructura de tabla para la tabla `c`

      CREATE TABLE IF NOT EXISTS `c` (
      `id` int(4) NOT NULL,
      `dir` varchar(40) NOT NULL,
      `numero` int(4) NOT NULL
      ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;


      — Volcado de datos para la tabla `c`

      INSERT INTO `c` (`id`, `dir`, `numero`) VALUES
      (1, ‘CALLE MACEO’, 305);


      — Índices para tablas volcadas


      — Indices de la tabla `c`

      ALTER TABLE `c`
      ADD PRIMARY KEY (`id`);


      — AUTO_INCREMENT de las tablas volcadas


      — AUTO_INCREMENT de la tabla `c`

      ALTER TABLE `c`
      MODIFY `id` int(4) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=3;
      /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
      /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
      /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

      //———————————————————————-

      Ya aqui tienen datos que les introduje a codigo en la siguiente página
      procesar-insertar-multiples.php
      //———————————————————————————-
      <?php
      include("funciones.php"); //aqui tengo mis funciones definidas aqui te muestro la de insert q tengo
      /*
      //INSERT
      function inserta($cmdSQL){
      $idConex = cnn();
      mysql_query($cmdSQL, $idConex);
      }
      */

      //datos de a
      //id no lo pongo porque es autoincrementar
      $nombre="pepe";
      $ci="12345678901";

      //datos de b
      //id no lo pongo porque es autoincrementar
      $sexo="M";
      $edad="29";

      //datos de c
      //id no lo pongo porque es autoincrementar
      $dir="CALLE MACEO";
      $numero="305";

      //voy a suponer que ya validastes que estas entradas no existan en la BD y pasare directamente a insertar

      $cmdSQLa="INSERT INTO a (nombre, ci) VALUES ('$nombre', '$ci')";
      inserta($cmdSQLa);

      $cmdSQLb="INSERT INTO b (sexo, edad) VALUES ('$sexo', '$edad')";
      inserta($cmdSQLb);

      $cmdSQLc="INSERT INTO c (dir, numero) VALUES ('$dir', '$numero')";
      inserta($cmdSQLc);

      echo'alert(“Correcto”);’;

      ?>

      //———————————————————————————-

      Y ya eso se lo tragó… saludos y que resuelvas me dices cualquier cosa… saludos

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *