Curso de PHP

Estás en: Paginar Resultados : Paginar los resultados de un select parametrizado

Paginar los resultados de un select parametrizado

Para paginar los resultados obtenidos de un select que está parametrizado hay que hacer lo siguiente:
- Crear la función "paginar" en un include
- Formulario con los datos que necesita el select para hacer la consulta
- Página que muestra los resultados del select paginados.

Include que contiene 2 variantes de la función "paginar"

Función paginar: << 1 | 2 | 3 >>
// Colocar en la página para crear el navegador < < 1 | 2 | 3 >>
// La llamada a la función sería: echo paginar($pag, $total_registros, $cantidad_reg, "index_paginado.php?pag=");

function paginar($pagina_actual, $total_registros, $registros_por_pagina, $enlace) 
{
   $paginas_totales=ceil($total_registros/$registros_por_pagina);
   // La función ceil devuelve el valor entero más alto que sale como resultado de la operación
	
   $anterior=$pagina_actual-1;
   $siguiente=$pagina_actual+1;

   if ($paginas_totales != 1) { // Cuando hay sólo una página, no hace falta poner nada
   // No tiene que hacer echos, sino generar una cadena
   $texto="";
		
   // Para poner el <<
	if ($pagina_actual>1) {
		$texto.="<a href=\"$enlace$anterior\"><<</a> ";
	}
	
   for($i=1; $i<=$paginas_totales; $i++) {
       if ($i==$pagina_actual){
           if ($i==$paginas_totales){
               $texto.="$i";			
           }else {	
               $texto.="$i |";
           }
       }elseif ($i==$paginas_totales) {
           $texto.="<a href=\"$enlace$i\">$i</a> ";
       }else {
           $texto.="<a href=\"$enlace$i\">$i</a> | ";
       }
   }

   // Para poner el >>
   if ($pagina_actual<$paginas_totales) {
       $texto.="<a href=\"$enlace$siguiente\">>></a> ";
   }
	
   return $texto;
   
}

Función paginar2: Anterior Página 1 de 5 Siguiente
function paginar2($pagina_actual, $total_registros, $registros_por_pagina, $enlace) 
{
   $paginas_totales=ceil($total_registros/$registros_por_pagina);
   // La función ceil devuelve el valor entero más alto que sale como resultado de la operación
	
   $anterior=$pagina_actual-1;
   $siguiente=$pagina_actual+1;

   // No tiene que hacer echos, sino generar una cadena
   $texto="";
	
   // Para poner el Anterior
   if ($pagina_actual>1) {
       $texto.="<a href=\"$enlace$anterior\">Anterior</a> ";
   }
	
   $texto.="Página $pagina_actual de $paginas_totales";
	
   // Para poner el Siguiente
   if ($pagina_actual<$paginas_totales) {
       $texto.=" <a href=\"$enlace$siguiente\">Siguiente</a> ";
   }
	
   return $texto;
}

Página que contiene el formulario

En el formulario hay que añadir un campo oculto para pasar la variable "pag", que es la que se refiere a la página en curso. Desde el formulario se pasa vacía, porque no tiene ningún datos. Se hace para que no de error de variable no definida en la página donde se listan los resultados.

<form action="listado_buscador.php" method="get">
   <fieldset>
       <legend>Palabra clave</legend>
       <input type="text" name="palabraclave" />
		
       <p>Puede limitar los resultados de la busqueda a:</p>
       <input type="radio" name="prestado" value="1" />Prestado
       <input type="radio" name="prestado" value="0" />No Prestado
       <input type="radio" name="prestado" value="todos" checked="checked" />Ambos
		
       <input type="submit" value="Buscar" class="boton" />
       <input name="pag" type="hidden" id="pag" /> 
	   <!--Se pone para que la primera vez que se llame a listado_buscador.php no falle al no 
	   ncontrar la variable pag, que es la que le dice cuál es la página en curso.
           Con pasar la variable sin valor es suficiente -->
   </fieldset>
</form>

Página que lista los resultados

<?php
$palabra=$_GET['palabraclave'];
$opcion_prestado=$_GET['prestado'];

// AÑADIR PARA PAGINAR
if ($_GET["pag"]=="") {
   $pagina=1;
}else {
   $pagina=$_GET["pag"];
}

$sql="SELECT * FROM libros, editoriales where (libros.id_editorial=editoriales.id_editorial) ";
//controlar prestado
if ($opcion_prestado!="todos")
{
   $prestado="AND prestado=".$opcion_prestado;
}else{
   $prestado="";
}
//controlar palabra depues de prestado
if($palabra!=""){
   $sql.=" AND (titulo LIKE '%$palabra%' OR descripcion LIKE '%$palabra%' OR claves LIKE '%$palabra%') $prestado";
}else{
   $sql.= " $prestado ";
}

echo $sql;

/*if($palabra!="")  //Sí ha introducido una palabra
{ 
   if ($prestado!="")  // Sí ha introducido la opción prestado
   {
       echo $sql.="AND (titulo LIKE '%".$palabra."%' OR descripcion LIKE '%".$palabra."%' OR claves LIKE '%".$palabra."') and prestado=".$prestado;
   }
   else{ // No ha introducido la opción prestado
       echo $sql.="AND (titulo LIKE '%".$palabra."%' OR descripcion LIKE '%".$palabra."%' OR claves LIKE '%".$palabra."')";
   }

}else {  // No ha introducido uan palabra
		echo $sql.="AND (titulo LIKE '%".$palabra."%' OR descripcion LIKE '%".$palabra."%' OR claves LIKE '%".$palabra."') and prestado=".$prestado;
}*/
echo "<br /><br />";

$resultado=mysql_query($sql);

// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<  PARA PAGINAR
$total_registros=mysql_num_rows ($resultado); // Nos dice cuántos registros hay en total

$cantidad_reg=3; // Cantidad de registros por página

$registro_inicio= ($pagina-1) * $cantidad_reg; // Página en la que estamos x el número de registros que mostramos por página
// Esto nos indica en el registro en el que nos tenemos que posicionar.

// Definimos de nuevo la consulta SQL LIMITADA
$sql.=" LIMIT $registro_inicio, $cantidad_reg";  // Añade la limitación al sql que había antes
// Si hay comillas dobles encerrando el select, dentro podemos poner las variables, sin tener que hacer concatenaciones. 
// Si el valor es texto, puede ir la variable entre las comillas simples

$resultado=mysql_query($sql);  

//   PARA PAGINAR <<<<<<<<<<<<<<<<<<<<<<<<<<<<<

if ($resultado) 
{
   if (mysql_num_rows($resultado)>0) // Si hay registros
   { 
//	$v_libro=mysql_fetch_array ($resultado);
?>

<table width="531" align="left">
<tr>
   <td width="249" align="left"><strong>Nº</strong></td>
   <td width="249" align="left"><strong>Título del libro</strong></td>
   <td width="183" align="left"><strong>Autor</strong></td>
   <td width="183" align="left"><strong>Editorial</strong></td>
   <td width="183" align="left"><strong>Temas</strong></td>
   <td width="183" align="left"><strong>Portada</strong></td>
   <td width="183" align="left"><strong>Información</strong></td>
   <td width="83"><strong>Prestado</strong></td>
</tr>

<?php 
while ($fila=mysql_fetch_array ($resultado)) { // devuelve una raiz con los datos del primer registro
?>  
<tr>
   <td align="left"><? echo $fila ["id"]?></td>
   <td align="left"><? echo $fila ["titulo"]?></td>
   <td align="left"><? echo $fila ["autor"]?></td>
   <td align="left"><? echo $fila ["editorial"]?></td>
   <td align="left"><? echo $fila ["claves"]?></td>
   <td align="left"><? echo "<img src=\"../images/minis/".$fila ["wfoto"]."\"  /> "?></td>
   <td align="left"><a href="../buscar_concepto/detalle_buscador.php?titulo_libro=<?php echo $fila["id"]?>">Ampliar</a></td>
   <td align="center"><? if ($fila['prestado']) {echo "SI";}else echo "NO"?></td>
</tr>

<?php 
} //while
?>	
</table>		

   <div class="paginado">
   <? 
      echo paginar ($pagina, $total_registros, $cantidad_reg, "listado_buscador.php?palabraclave=$palabra&prestado=$opcion_prestado&pag=");
      // Cuando necesitamos que liste dependiendo de un parámetro de búsqueda, porque 
      // el select está parametrizado, habría que ponerlo de la siguiente manera:
      // echo paginar2 ($pagina, $total_registros, $cantidad_reg, "listardo_buscador.php?id=4$pag=");
   ?>
   </div><!--paginado -->
   <?php	
   }
   ?>
<?php	
}
?>