Cómo paginar los mensajes de un foro

Cuál sería el código para que apareciera un número por cada 10 mensajes existentes en una base de datos, y que éste vinculara a esos 10 mensajes, es decir que si pulsamos el 1 veamos los 10 últimos mensajes, el 2 los 10 anteriores...
5

5 Respuestas

165.700 pts.
Lo primero tienes que dividir el número total de mensajes entre 10, y si el resultado no es entero haces que lo sea cogiendo el más próximo por arriba. Es decir, si tienes 51 mensajes te daría 5,1 entonces tienes que coger un 6. Este 6 representaría el número de grupos de 10 mensajes que tienes que usar.
Al crear los enlaces para los números puedes pasar como parámetro el número. Puedes poner algo parecido a lo siguiente:
<a href='mostrarmensajes.php?num=1'> 1 </a>
<a href='mostrarmensajes.php?num=2'> 2 </a>
...
Mostrarmensajes.php sería la misma página que contiene esa parte de código. Se llama a si misma con un parámetro. Al comiento de la página puedes poner:
<?php
$numEnlace = $_GET['num']
$mensajeInicio = (($numEnlace-1) * 10)+1
// ...
// Aquí realizas la consulta a la base de datos cogiendo 10 mensajes desde el mensaje que ocupa la posición $mensajeInicio, y vas creando con ellos la página web que será visible para el usuario. También puedes usar un array.
// ...
// Por aquí tendrías que poner el código de los enlaces que te puse arriba.
// ...
?>
Más o menos el esqueleto sería ese. $NumEnlace te sirve por ejemplo para poner el enlace a ese número de distinto color, o sin enlace, ya que corresponde a los mensajes que se esta mostrando.
La consulta la ordenas de forma descendente por fecha de los mensajes, de esta forma el 1 corresponderá a los 10 últimos y el 2 a los 10 anteriores, etc.
La consulta a la base de datos va a ser lo más complicado, ya que en la base de datos no deberías tener nada que relacione a los 10 últimos mensajes con el 1, y los demás con su número correspondiente. En caso contrario, si decides mostrar 20 en vez de 10 tendrías que cambiar toda la base de datos.
Por tanto puedes hacer una consulta para coger todos los mensajes y luego los almacenas en un array y ya no necesitas hacer más consultas.
O bien, puedes realizar varias consultas a la base de datos obteniendo mensajes de 10 en 10, eso depende ya de cómo esté creada la base de datos, de los campos que tenga, cuáles sean clave, y cuáles te sirvan para ordenar.
Intenta realizar una consulta sabiendo que si $mensajeInicio es 1 obtienes los 10 primeros, si es 2 obtienes del 11 al 20, si es 3 del 21 al 30, etc.
Esa consulta puede ser complicada. Por lo demás creo que no habría problemas. Plantea lo del array, quizá sea mejor solución.
Yo no busco una solución con array.
Simplemente yo quiero que se muestre un número por cada 10 mensajes de la base empezando a contar páginas desde 1, no desde 0, es decir que el vínculo 1 me mande a la página 0.
Pero que los números se muestren automáticamente, no haya que almacenarlos en un array.
La idea es pasar como parámetro en la barra de URL del navegador el número. A partir de ese número calcular los 10 mensajes que se tienen que mostrar. Y mostrar por último una lista de números que permita navegar entre el resto de grupos de 10 mensajes:
<?php
// Calcula cuántos números tienes que mostrar de la forma que te puse antes: a partir del total de mensajes dividido por 10, y si salen decimales coges el entero siguiente. Almacenalo en $numTotalMsj. Esto podría ser una consulta del tipo "SELECT COUNT(*) FROM mensajes"
$numEnlace = $_GET['num'];
if( $numEnlace < 1 ) {
$numEnlace = 1;
}
$mensajeInicio = ($numEnlace * 10)-10
// Consulta a la base de datos para obtener los mensajes del mensajeInicio hasta (mensajeInicio+10). Esta consulta depende de cómo tengas la base de datos.
// Mostrar esos mensajes con el formato adecuado.
// Por último la lista de números:
for( i = 1; i++, i<= $numTotalMsj) {
echo "<a href='mostrarmensajes.php?num=$i'> $i </a>";
}
?>
Prueba este código. Sigo pensando que lo más difícil es la consulta para obtener los 10 mensajes que correspondan, y eso depende en gran medida de la tabla que uses en la base de datos para almacenar los mensajes.
Si todavía no ha quedado claro o no estoy respondiendo a lo que me pides, no dudes en volver a consultarme.
Ahora que ya se algo más de php, ya me he aclarado, pero ya tenía terminado el foro
Si quieres ver mis avances: www.felixiana.tk
Gracias
5.550 pts.
Te propongo que hagas lo siguiente...
$link = mysql_connect('localhost','user','password');
$sql="select dato from tabla where dato=algo";
$rs=mysql_db_query('db',$sql,$link);
$resultado = mysql_fetch_array($rs);
for ($i=0;$i<10;i++){
print $resultado[posicion_del_mensaje_en_la_tabla];
}
Tú solución no es lo que busco
Yo quiero que se muestre un número por cada 10 mensajes de la base empezando a contar páginas desde 1, no desde 0, es decir que el vínculo 1 me mande a la página 0
Has lo siguiente:
Crea una función en php que reciba como parámetros enlace, numero y consulta.
<?
function foro($url,$num,$sql){
print"<a href=$url>$num</a>";
}
?>
En la pagina donde vas a mostrar los mensajes debes ejecutar la consulta.
El llamado a la funcion seria:
<?
$sql="select dato from tabla LIMIT 1,10";
foro("pagina1.php",1,$sql);
?>
Espero que te sirva, si no entonces es que no te he entendido bien tu pregunta.
3.225 pts.
Te voy a mandar un código que yo utilice para paginar... espero te sirva...
---------
<?
// Conexión a la base de datos
$link = mysql_connect ("tu_servidor_mysql","tu_usuario","tu_password") or die("Error de conexion");
mysql_select_db("tu_base_de_datos",$link) or die ("Error al selecionar base de datos");
$iva=0.15; // Impuesto al valor agregado 15%
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Catalogo de Bar</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script language="JavaScript">
<!--
function change_page(forma, b) {
forma.b.value = b;
forma.submit();
}
</script>
</head>
<body text="#1763aa" link="#1763aa" vlink="#1763aa" alink="#1763aa" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" onLoad="MM_preloadImages('file:///V|/hotelito/images/agregar2.jpg'); checa_invent()">
<table width="750" border="0" align="center" cellpadding="0" cellspacing="0">
<tr align="center" bgcolor="#f5f5f5">
<td colspan="2" align="left"><font color="#000066" size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong>Catálogo
de Bebidas</strong></font></td>
</tr>
<?php
$query = "SELECT * FROM tu_tabla ORDER BY elige_tu_ordenamiento";
$getresults = mysql_query($query);
$resultsnumber = mysql_num_rows($getresults); // numero de registros en la consulta
if($resultsnumber > 0){
if(!isset($regpp)) $regpp = 10; // regpp es Registros Por Pagina por defecto es 10
if ($regpp == "all")
$regpp = $resultsnumber;
else
if ($regpp > $resultsnumber)
$regpp = $resultsnumber;
if (!isset($b)) $b=1; // b representa la pagina que se desea mostrar, por defecto es la primera pagina
$ln = ceil($resultsnumber/$regpp); // ln es el numero depaginas que se obtienen
if($b > $ln) $b = $ln;
$indice_i = ($b*$regpp)-$regpp; // registro inicial
if ($resultsnumber<$regpp)
$indice_s = $resultsnumber; // registro final
elseif (($b*$regpp)<$resultsnumber)
$indice_s = $indice_i + $regpp;
elseif (($b*$regpp)>$resultsnumber)
$indice_s = ($indice_i+($resultsnumber%$regpp));
else
$indice_s= $resultsnumber;
?>
<form name="lista" method="post" action="bar_.php">
<tr align="center" bgcolor="#f5f5f5">
<td align="left" valign="bottom"><font color="#000066" size="2" face="Verdana, Arial, Helvetica, sans-serif">Número
de bebidas registradas: <? echo $resultsnumber;?></font></td>
<td width="50%" colspan="-2" align="right" valign="bottom"><font color="#000066" size="2" face="Verdana, Arial, Helvetica, sans-serif">Mostrar </font>
<font color="#000066" face="Verdana, Arial, Helvetica, sans-serif" size="1">
<select name="regpp" size="1" class="campo1" onChange="change_page(document.lista,1);">
<?php for($i=1; $i<6; ++$i){?>
<option value="<?php echo $i*10;?>"<?php if($i*10 == $regpp) print " selected";?>><?php echo $i*10;?></option>
<?php }?>
<option value="100" <? if ($regpp == 100) echo "selected";?>>100</option>
<option value="all" <? if ($regpp == $resultsnumber) echo "selected";?>>Todas</option>
</select>
</font><font color="#000066"> <font size="2" face="Verdana, Arial, Helvetica, sans-serif">bebidas
por página</font></font></td>
</tr>
<input type="hidden" name="b" value="<? echo $b;?>">
</form>
</table>
<table width="750" border="0" align="center" cellpadding="0" cellspacing="2">
<tr valign="middle" bgcolor="#1a50b8">
<td nowrap><strong><font color="#FFFFFF" size="1" face="Verdana, Arial, Helvetica, sans-serif">  Categoría</font></strong></td>
<td><strong><font color="#FFFFFF" size="1" face="Verdana, Arial, Helvetica, sans-serif">  Producto</font></strong></td>
<td align="center" nowrap bgcolor="#1a50b8"><strong><font color="#FFFFFF" size="1" face="Verdana, Arial, Helvetica, sans-serif">Unidad</font></strong></td>
<td align="center" nowrap bgcolor="#1a50b8"><strong><font color="#FFFFFF" size="1" face="Verdana, Arial, Helvetica, sans-serif">Existencia</font></strong></td>
<td align="center" nowrap><strong><font color="#FFFFFF" size="1" face="Verdana, Arial, Helvetica, sans-serif">Existencia<br>
mínima</font></strong></td>
<td align="center" nowrap><strong><font color="#FFFFFF" size="1" face="Verdana, Arial, Helvetica, sans-serif">Precio<br>
copa</font></strong></td>
<td align="center" nowrap><strong><font color="#FFFFFF" size="1" face="Verdana, Arial, Helvetica, sans-serif">Precio<br>
c/iva </font></strong></td>
<td align="center" nowrap><strong><font color="#FFFFFF" size="1" face="Verdana, Arial, Helvetica, sans-serif">Precio<br>
botella </font></strong></td>
<td align="center" nowrap><strong><font color="#FFFFFF" size="1" face="Verdana, Arial, Helvetica, sans-serif">Precio<br>
c/iva</font></strong></td>
<td align="center" nowrap><font color="#FFFFFF" size="1" face="Verdana, Arial, Helvetica, sans-serif"><strong>Unidades<br>
Botella</strong></font></td>
</tr>
<? // este for solo lee los registros que se le indican..
// cambia las variables y los campos por los de tu tabla...
for($i=$indice_i; $i<$indice_s; ++$i){
$idx = mysql_result($getresults,$i,"idx");
$categoria = mysql_result($getresults,$i,"categoria");
$producto = mysql_result($getresults,$i,"producto");
$unidad = mysql_result($getresults,$i,"unidad");
$existencia = mysql_result($getresults,$i,"existencia");
$minimo = mysql_result($getresults,$i,"minimo");
$precio_copa = mysql_result($getresults,$i,"precio_copa");
$precio_bote = mysql_result($getresults,$i,"precio_bote");
$uni_bote = mysql_result($getresults,$i,"uni_botella");
?>
<tr valign="middle" bgcolor="#f5f5f5">
<td nowrap><font color="#003366" size="1" face="Arial, Helvetica, sans-serif">  <? echo $categoria;?></font></td>
<td><font color="#003366" size="1" face="Arial, Helvetica, sans-serif">  <? echo $producto;?></font></td>
<td align="center"><font color="#003366" size="1" face="Arial, Helvetica, sans-serif"><? echo $unidad;?></font></td>
<td align="center"><font color="#003366" size="1" face="Arial, Helvetica, sans-serif"><? echo $existencia;?></font></td>
<td align="center"><font color="#003366" size="1" face="Arial, Helvetica, sans-serif"><? echo $minimo;?></font></td>
<td align="center" nowrap><font color="#003366" size="1" face="Arial, Helvetica, sans-serif"><? echo number_format($precio_copa,2);?></font></td>
<td align="center" nowrap><font color="#003366" size="1" face="Arial, Helvetica, sans-serif"><? echo number_format(($precio_copa+$precio_copa*$iva),2);?></font></td>
<td align="center" nowrap><font color="#003366" size="1" face="Arial, Helvetica, sans-serif"><? echo number_format($precio_bote,2);?></font></td>
<td align="center" nowrap><font color="#003366" size="1" face="Arial, Helvetica, sans-serif"><? echo number_format(($precio_bote+$precio_bote*$iva),2);?></font></td>
<td align="center" nowrap><font color="#003366" size="2" face="Arial, Helvetica, sans-serif"><?php echo $uni_bote; ?> </font></td>
</tr>
<? } // Termina For ?>
<tr valign="middle">
<td colspan="10" align="center"> <table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr bgcolor="#f5f5f5">
<form action="" name="blk" method="post">
<td width="50%" align="left" valign="bottom"><font color="#000066" size="2" face="Verdana, Arial, Helvetica, sans-serif">Página
No. 
<?
if ($resultsnumber >= $regpp){
$b_before = $b-1; ?>
<select name="paginas" class="campo1" onChange="change_page(document.lista,this.options[this.selectedIndex].value);">
<? for ($j=0; $j<$ln; ) {
$j++; ?>
<option value="<? echo $j;?>" <? if($j==$b) print "selected";?>><? echo $j;?></option>
<? } ?>
</select>
 de 
<?
echo $ln;
$j=$b+1;
} // IF resultsnumber>=$regpp ?>
</font></td>
</form>
<td width="50%" align="right" valign="bottom"> <font color="#000066" size="2" face="Verdana, Arial, Helvetica, sans-serif">
<? if ($b>1)
print "<a href=\"javascript:change_page(document.lista,$b_before)\">Anterior</a>";
else
print "Anterior";
print " | ";
if( ($regpp*$b)>=$resultsnumber )
print"Siguiente";
else
print "<a href=\"javascript:change_page(document.lista,$j)\">Siguiente</a>"; ?>
</font> </td>
</tr>
</table></td>
</tr>
</table>
<? } // fin if results > 0 ?>
</body>
</html>
---------
Solo modifica lo necesario...
Tú página está muy currada, pero es más de lo que yo buscaba, yo quiero que se muestre un número por cada 10 mensajes de la base empezando a contar páginas desde 1, no desde 0, es decir que el vínculo 1 me mande a la página 0
Para eso solo tienes que cambiar el código que genera la lista de paginas por los links que tu quieres... es ahi donde se hace eso..
41.425 pts.
Aquí tienes un artículo muy bien elaborado y ejemplificado sobre paginación php-mysql:
http://www.desarrolloweb.com/articulos/1035.php?manual=6
Si tienes alguna duda pregunta sin problemas.
Saludos,
iNphYx
14.800 pts. FORMACION ACADEMICA BUP y COU: (1996-2001) Ciclo...
Cuál sería el código para que apareciera un número por cada 10 mensajes existentes en una base de datos, y que éste vinculara a esos 10 mensajes, es decir que si pulsamos el 1 veamos los 10 últimos mensajes, el 2 los 10 anteriores...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas