Gracias a sus artículos he podido superar un montón de problemas, asi que opté por retribuirles algo del crédito de lo que he aprendido enviándoles algo que me resulta súmamente cómodo al tener que hacer paginado de resultados desde una base de datos.
Imaginen que tienen una web, a la izquierda hay un menú que lista las categorias de una sección en particular, y al lado derecho una tabla con los encabezados de cara columna.
Además a la izquierda tengo un jumpmenu con un listado de los meses del año, para poder filtrar tanto por categoría como por meses o ambos.
Los resultados estan filtrados además para ciertos usuarios, por lo que hay que validar esto también al momento de hacer la consulta a la base de datos.
Según el click que hagan a la opción de la izquierda, se reflejan los cambios en la derecha, con el paginador asociado y listo para avanzar a la siguiente página sin tener que volver a presionar la categoría.
Código PHP:
// --Paginado-- inicio
if((!isset($_GET['page'])) || ($_GET['page'] < 1)) $page = 1; else $page = $_GET['page'];
if (isset($_GET["max"])) {$max = $_GET["max"];} else { $max = "";}
// Valores del salto por fecha
if (isset($_GET["mes"])){ $mes = $_GET["mes"]; } else {$mes = '';}
if (isset($_GET["ti"])) { $ti = $_GET["ti"]; } else {$ti = 'all';}
Después esto otro:
Código PHP:
/********** CONSULTA DINAMICA DE REGISTROS *******************/
/*
SI SE INGRESA CATEGORIA (TIPO) Y SIN MES, SE HACE CONSULTA PARA QUE BUSQUE REGISTROS CUYO DUEÑO SEA "CLIENTES" Y EL USUARIO
ACTIVO EN ESTE MOMENTO; SEGUN SU IDENTIFICADOR y CON ESOS RESULTADOS SE FILTRAN LA CATEGORIA ESCOGIDA
*/
if (($ti != 'all') and ($mes == ''))
{
$sql = "SELECT * FROM (SELECT * FROM tabla
WHERE iddueno = '1' OR iddueno = '".$_SESSION['iduser']."') AS ex
WHERE tipo = '$ti'"; //Con Tipo sin Mes
//Cantidad total de filas para hacer paginado
$SQL_total = "SELECT COUNT(*) FROM (SELECT * FROM tabla
WHERE iddueno = '1' OR iddueno = '".$_SESSION['iduser']."') AS ex
WHERE tipo = '$ti'";
$rec_total = mysql_query($SQL_total);
$total_results = mysql_result($rec_total,0);
}
/*
SI SE INGRESA CATEGORIA (TIPO) Y MES, SE HACE CONSULTA PARA QUE BUSQUE REGISTROS CUYO DUEÑO SEA "CLIENTES" Y EL USUARIO
ACTIVO EN ESTE MOMENTO; SEGUN SU IDENTIFICADOR y CON ESOS RESULTADOS FILTRA CATEGORIAS Y MES SELECCIONADOS.
*/
else if (($ti != 'all') and ($mes != ''))
{
$sql = "SELECT * FROM ( SELECT * FROM tabla
WHERE iddueno = '1' OR iddueno = '".$_SESSION['iduser']."') AS ex
WHERE tipo = '$ti' AND (Month( publicado ) = '$mes')"; //Con Tipo con Mes
//Cantidad total de filas para hacer paginado
$SQL_total = "SELECT * FROM ( SELECT * FROM tabla
WHERE iddueno = '1' OR iddueno = '".$_SESSION['iduser']."') AS ex
WHERE tipo = '$ti' AND (Month( publicado ) = '$mes')";
$rec_total = mysql_query($SQL_total);
$total_results = mysql_num_rows($rec_total);
}
/*
SI NO SE INGRESA CATEGORIA (TIPO) Y SIN MES, SE HACE CONSULTA PARA QUE BUSQUE REGISTROS CUYO DUEÑO SEA "CLIENTES" Y EL USUARIO
ACTIVO EN ESTE MOMENTO; SEGUN SU IDENTIFICADOR
*/
else if (($ti == 'all') and ($mes == ''))// Sin Tipo, sin Mes
{
$sql = "SELECT * FROM tabla WHERE iddueno = '".$_SESSION['iduser']."' OR iddueno = '1'";
//Cantidad total de filas para hacer paginado
$SQL_total = "SELECT COUNT(*) AS cantidad FROM tabla WHERE iddueno = '".$_SESSION['iduser']."' OR iddueno = '1'";
$rec_total = mysql_query($SQL_total);
$total_results = mysql_result($rec_total,0);
}
/*
SI NO SE INGRESA CATEGORIA (TIPO) Y SI MES, SE HACE CONSULTA PARA QUE BUSQUE REGISTROS CUYO DUEÑO SEA "CLIENTES" Y EL USUARIO
ACTIVO EN ESTE MOMENTO; SEGUN SU IDENTIFICADOR y CON LOS RESULTADOS SE FILTRA EL MES SELECCIONADO.
*/
else if (($ti == 'all') and ($mes != ''))// Sin Tipo con Mes
{
$sql = "SELECT * FROM ( SELECT * FROM tabla
WHERE iddueno = '1' OR iddueno = '".$_SESSION['iduser']."') AS ex
WHERE (Month( publicado ) = '$mes')";
//Cantidad total de filas para hacer paginado
$SQL_total = "SELECT * FROM ( SELECT * FROM tabla
WHERE iddueno = '1' OR iddueno = '".$_SESSION['iduser']."') AS ex
WHERE (Month( publicado ) = '$mes')";
$rec_total = mysql_query($SQL_total);
$total_results = mysql_num_rows($rec_total);
}
/***********************************************************************************************************************/
Primero asigna la consulta correcta a una variable llamada sql, que es la que luego mostrará los resultados, pero también debe volver a preguntar para poder obtener la cantidad de resultados que deberá paginar. Traté de hacer todo con 1 sola consulta, pero por algun error marciano, no me dejó. De seguro alguien más experimentado podrá decirles alguna forma de realizar esto más eficiente. (eso espero en todo caso :P )
Teniendo la consulta correcta y los valores de registros en variables separadas podemos continuar:
Código PHP:
*******************************************************************************/
/* Paginador de Resultados Dinámicos Marcianos por Orlando Caffarena */
/********************************************************************************/
// Calcula cantidad de campos según la consulta SQL entregada. Cuenta las cagas.
//$rec_total = mysql_query($SQL_total);
//$total_results = mysql_num_rows($rec_total);
// Definir el numero de paginas y los limites
//5 respuestas por página
$max_results = 5;
$inf_limit = $max_results * ($page - 1);
// Cantidad total de registros segun limites.
// Obtiene pines UNICOS que han recargado alguna vez
$recargados = "";
$recargados = $sql. " LIMIT $inf_limit, $max_results";
// Ejecuta la consulta SQL sólo con los parámetros indicados al inicio.
$resulcarga = "";
$resulcarga = mysql_query($recargados);
// Obtiene la cantidad de páginas disponibles según la fórmula matemática Total resultados / Max resultados. Redondeado a más usando la funcion CEIL().
//NOTA: Ceil() redondea a más. Floor() redondea a menos.
$total_pages = "";
$total_pages = ceil($total_results / $max_results);
/* DEBUG DE VARIABLES PARA VER SI RECIBEN LOS DATOS CORRECTOS. ELIMINAR AL MOMENTO DE SUBIR A SERVIDOR DE PRODUCCION.
echo $recargados." = Consulta SQL";
echo $total_results." = TOTAL FILAS";
echo $total_pages." = TOTAL PAGINAS";
*/
// - Fin - paginado--Fin
/**************************************************************/
Código PHP:
if ((!$resulcarga) or ($total_results == 0))
{
echo "<tr>\n";
echo "<td colspan='7'>No existen archivos asociados</td>";
echo "</tr>\n";
} else {
while ($valor = mysql_fetch_array($resulcarga))
{
echo "<tr>\n";
echo "<td>".tipo_productos($valor[1])."</td>\n";
echo "<td>".$valor[2]."</td>\n";
echo "<td>".$valor[3]."</td>\n";
echo "<td>".$valor[4]."</td>\n";
echo "<td>".$valor[5]."</td>\n";
echo "<td><a href='download.php?path=".$valor[6]."' title='Descargar' class='descarga'> </a></td>\n";
echo "<td>".$valor[7]."</td>\n";
echo "</tr>\n";
}
}
?>
Tiene un estilo similar al que tiene google. Genera hasta 5 numeros, dejando en negrita la página actual. en caso de que escogas la página 2, el rango será sólo de las páginas 23456- O sea, avanza uno hacia adelante y esconde el 1. Además tiene los links para adelante, atrás, primera y ultima páginas.
el formato final se vería asi.
|<< 1 2 3 4 5 > >|
(Sigue abajo)....