Quijost
Webmaster => Desarrollo Web => Mensaje iniciado por: espada en Julio 06, 2010, 02:13:39 am
-
Hola, me gustaría saber como se hace para que haya un limite de "entradas" o cualquier cosa descargada de la base de datos por hoja y que en caso de haber mas aparezca un siguiente y al darle continué con las "entradas". seria tipo blog para mostrar entradas mas antiguas. Si alguien puede ayudarme gracias por adelantado.
-
Es facil, digamos que tienes 80 entradas o registros.
Haces una consulta mysql para obtener este total (con mysql_num_rows())
Después si quieres paginar por cada 5 entradas o registros, tendrías que dividir para que te dieran las entradas por página.
Por ejemplo, la página 1, tendría las entradas de la 0 a la 4, la página 2 de la 5 a 9, etc.
-
bufff no me ayuda demasiado a ver el codigo que tengo ahora mismo es este:
<?php
$connect = mysql_connect('localhost', 'usuario', 'cotraseña');
mysql_select_db('sensei_blog', $connect);
$result = mysql_query("SELECT entrada, imagen, autor, title FROM blog WHERE seccion='principal' ORDER BY id DESC", $connect);
echo '<table>';
while($row = mysql_fetch_array($result))
{
echo '<tr><td><center>
<span style="font-weight:bold; font-size:20px; color:#FFFFFF;">'.$row['title'].'</span>
<br/><br/>
<img alt=cabezera src='.$row['imagen'].'>
</br></br>
<div style="color:#FFFFFF;">'.nl2br($row['entrada']).'</div>
</center> </br> </br>
<p align="right" style="color:#FFFFFF;"> autor: '.$row['autor'].'</p>
</td></tr>';
}
echo '</table>';
?>
con esto las entradas se me muestran en la web, pero se me muestran todas me gustaría que solo se mostraran 5 o 10 y en caso de haber mas en la parte inferior apareciese un botón para ver las siguientes. quizá ahora puedas decirme mejor que hacer
-
Como te comento mi compañero shakaran, es sencillo usando la función mysql_num_rows para obtener el número total de entradas, y si por ejemplo quieres limitar a las 5 primeras entradas en tu bucle, basta con poner una variable $i que sea un contador y que muestre solo las solicitadas. Aunque de esta forma esta poco optimo ya que se recorrería el bucle para todas las entradas (si tuvieras 3000 sería muy lento) por eso he añadido una variable booleana para que el bucle se detenga una vez pase de las entradas seleccionadas.
El código adaptado sería:
<?php
$connect = mysql_connect('localhost', 'usuario', 'cotraseña');
mysql_select_db('sensei_blog', $connect);
$result = mysql_query("SELECT entrada, imagen, autor, title FROM blog WHERE seccion='principal' ORDER BY id DESC", $connect);
$total_post = mysql_num_rows($result);
echo '<table>';
$i = 0;
$continue = true;
while($row = mysql_fetch_array($result) && $continue)
{
if($i >0 or $i < 5)
{
echo '<tr><td><center>
<span style="font-weight:bold; font-size:20px; color:#FFFFFF;">'.$row['title'].'</span>
<br/><br/>
<img alt=cabezera src='.$row['imagen'].'>
</br></br>
<div style="color:#FFFFFF;">'.nl2br($row['entrada']).'</div>
</center> </br> </br>
<p align="right" style="color:#FFFFFF;"> autor: '.$row['autor'].'</p>
</td></tr>';
}
else $continue = false;
}
echo '</table>
<br />
Número total de entradas: '.$total_post;
?>
-
mil gracias ernesto, ya lo entendí, para mostrar luego en otra pagina las 5 siguientes seria modificar "if($i >0 or $i < 5)" por "if($i >5 or $i < 10)" ¿no? Es que me parece que no por que así se bloquearía al principio no mostraría nada... solo me falta eso, como mostrar las 5 siguientes luego el crear los botones creo que me las arreglare
-
Para mostrar las 5 siguientes tal vez necesitarías tener una variable $page que te dijera el "rango" de páginas a mostrar.
Puedes recibir esta variable por parámetro, por ejemplo tupagina.com?page=2
Y al recibirla hacer que el while muestre solo las entradas entre $page*5 y ($page+1)*5
-
Y por que no pruebas a hacerlo con "LIMIT" en la sentencia SQL?
SELECT * FROM `mi_tabla` LIMIT 60 , 30
Si no recuero mal 60 es el registro por el que empiezas y 30 son los que coges, es decir, cuantas entradas quieres mostrar. Para que esto funcione bien, supongo que por defecto la tabla debe tener ordenadas cronologicamente las entradas del blog.
-
he usado el metodo de SixLima, ya que si parecia mas sencillo aun que no se si tambien e usado ideas de ernestmego total que no funciona... he puesto mediante un if los botones para que se muestren solo en caso de ser necesarios el codigo es el siguiente.
<?php
$connect = mysql_connect('localhost', 'user', 'pass');
mysql_select_db('sensei_blog', $connect);
if ($_get["start"]=="")
{ $start=1;}
else
{$start=$_get["start"];}
$end = 5;
$result = mysql_query("SELECT entrada, imagen, autor, title FROM blog WHERE seccion='TEST' ORDER BY id DESC LIMIT $start , $end", $connect);
$total = mysql_num_rows($result);
echo '<table>';
while($row = mysql_fetch_array($result))
{
echo '<tr><td><center>
<span style="font-weight:bold; font-size:20px; color:#FFFFFF;">'.$row['title'].'</span>
<br/><br/>
<img alt=cabezera src='.$row['imagen'].'>
</br></br>
<div style="color:#FFFFFF;">'.nl2br($row['entrada']).'</div>
</center></br></br>
<p align="right" style="color:#FFFFFF;"> autor: '.$row['autor'].'</p></td></tr>';
}
echo '</table>';
if ($start != 1)
{
echo '<div style="float:left>';
echo '<a href="http://sensei.quijost.com/?start='.$start += 5 .'">ENTRADAS RECIENTES</a>
</div>';
}
if (($start += 5) <= $total)
{
echo '<div style="align:right">';
echo '<a href="http://sensei.quijost.com/?start='.$start -= 5 .'">ENTRADAS ANTERIORES</a>
</div>';
}
?>
-
Uff, identa un poco el código y para el echo tan largo que tienes ponlo en varias lineas (ojo pero con un mismo echo).
Yo creo que no te funciona porque estas modificando el $start, pero no sumas nunca nada al $end.
-
Ahora lo modifico, en el anterior lo cambie pero en este se paso. El $end no lo modifico por que segun entendi a SixLima es el numero de post que se van a mostrar, siempre quiero que se muestren 5 pero empezando 5 mas tarde. Yo creo que sera mas bien un error en los if, o al pedir el numero total de entradas, pero no se exactamente que es lo que puede fallar.
-
Si llevas razón, no recordaba como funcionaba el LIMIT (es algo que lo usas un par de veces y luego copias y pegas):
http://php.about.com/od/mysqlcommands/g/Limit_sql.htm
<?php
$dbh = mysql_connect('localhost', 'user', 'pass');
mysql_select_db('sensei_blog', $dbh);
$start = (empty($_get["start"]) ? 0 : $_REQUEST["start"]);
$end = 5;
$res = mysql_query("SELECT entrada, imagen, autor, title FROM blog
WHERE seccion='TEST' ORDER BY id DESC LIMIT $start,$end", $dbh);
$n = mysql_num_rows($res);
echo '<table>';
while($row = mysql_fetch_array($res))
{
echo '<tr>
<td>
<center>
<span style="font-weight:bold; font-size:20px; color:#FFFFFF;">
'.$row['title'].'
</span>
<br />
<br />
<img alt="cabezera" src="'.$row['imagen'].'">
<br />
<br />
<div style="color:#FFFFFF;">
'.nl2br($row['entrada']).'
</div>
</center>
<br />
<br />
<p align="right" style="color:#FFFFFF;">
autor: '.$row['autor'].'
</p>
</td>
</tr>';
}
echo '</table>';
if($start > 0)
{
echo '<div style="float:left>
<a href="?start='.($start + 5).'">ENTRADAS RECIENTES</a>
</div>';
}
if(($start + 5) <= $total)
{
echo '<div style="align:right">
<a href="?start='.($start - 5).'">ENTRADAS ANTERIORES</a>
</div>';
}
?>
Hay va el código bien corregido, identando, y con muchas cosas que tenias mal, no haga un $start += 5 que sino estas aumentando en 5 la variable, y hacías unas cosa muy raras. No te hace falta poner el nombre del dominio en los href y los <br> llevan la / al final, no al principio <br /> y bueno mas cosas que por no perder tiempo puedes comparar en los dos pedazos de código.
-
Tras el sufrimiento la recompensa. Ya que estaba puesto aproveche para asignar la sección del foro mediante una variable y así tener que estar pendiente de un solo index y no tener uno por sección.
<?php
$dbh = mysql_connect('localhost', 'usuario', 'contraseña');
mysql_select_db('sensei_blog', $dbh);
$start = (empty($_REQUEST["start"]) ? 0 : ($_REQUEST["start"]));
$section = (empty($_REQUEST["seccion"]) ? principal : ($_REQUEST["seccion"]));
$end = 5;
$res = mysql_query("SELECT entrada, imagen, autor, title FROM blog
WHERE seccion='".$section."' ORDER BY id DESC LIMIT ".$start.",".$end."", $dbh)
or die('Error select_blog: '.mysql_error());
$n = mysql_num_rows($res);
echo '<table>';
while($row = mysql_fetch_array($res))
{
echo '<tr>
<td>
<center>
<span style="font-weight:bold; font-size:20px; color:#FFFFFF;">
'.$row['title'].'
</span>
<br />
<br />
<img alt="cabezera" src="'.$row['imagen'].'">
<br />
<br />
<div style="color:#FFFFFF;">
'.nl2br($row['entrada']).'
</div>
</center>
<br />
<br />
<p align="right" style="color:#FFFFFF;">
autor: '.$row['autor'].'
</p>
</td>
</tr>';
}
echo '</table>';
if($start > 0)
{
echo '<div style="float:left">
<a href="?start='.($start - 5).'">ENTRADAS RECIENTES</a>
</div>';
}
if(($start + 5) <= $n)
{
echo '<div style="align:right">
<a href="?start='.($start + 5).'">ENTRADAS ANTERIORES</a>
</div>';
}
?>
Hernesto, SixLima, Shakaran gracias a todos una vez mas veloces y precisos.
Este finde intentare sacar un rato y hacer un tutorial de esto, que una vez lo consigues parece fácil pero he sudado sangre para llegar a esto.