Quijost

Webmaster => Desarrollo Web => Mensaje iniciado por: espada en Julio 06, 2010, 02:13:39 am

Título: "Cambiar de hoja"
Publicado 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.
Título: Re:"Cambiar de hoja"
Publicado por: shakaran en Julio 06, 2010, 09:55:06 am
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.
Título: Re:"Cambiar de hoja"
Publicado por: espada en Julio 06, 2010, 18:35:26 pm
bufff no me ayuda demasiado a ver el codigo que tengo ahora mismo es este:
Código: [Seleccionar]
<?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
Título: Re:"Cambiar de hoja"
Publicado por: ernestmego en Julio 06, 2010, 19:00:30 pm
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:
Código: [Seleccionar]
<?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 >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;
?>
Título: Re:"Cambiar de hoja"
Publicado por: espada en Julio 06, 2010, 19:44:15 pm
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
Título: Re:"Cambiar de hoja"
Publicado por: ernestmego en Julio 06, 2010, 21:29:22 pm
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



Título: Re:"Cambiar de hoja"
Publicado por: SixLima en Julio 06, 2010, 23:30:33 pm
Y por que no pruebas a hacerlo con "LIMIT" en la sentencia SQL?

Código: [Seleccionar]
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.
Título: Re:"Cambiar de hoja"
Publicado por: espada en Julio 09, 2010, 01:42:29 am
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.

Código: [Seleccionar]
<?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 += .'">ENTRADAS RECIENTES</a>
</div>'
;
}

if (($start += 5) <= $total)
{
echo '<div style="align:right">';
echo '<a href="http://sensei.quijost.com/?start='.$start -= .'">ENTRADAS ANTERIORES</a>
</div>'
;
}
?>

Título: Re:"Cambiar de hoja"
Publicado por: shakaran en Julio 09, 2010, 02:12:28 am
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.
Título: Re:"Cambiar de hoja"
Publicado por: espada en Julio 09, 2010, 02:16:47 am
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.
Título: Re:"Cambiar de hoja"
Publicado por: shakaran en Julio 09, 2010, 02:34:14 am
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

Código: [Seleccionar]
<?php
   $dbh 
mysql_connect('localhost''user''pass');
   
mysql_select_db('sensei_blog'$dbh);
   
$start = (empty($_get["start"]) ? $_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.
Título: Re:"Cambiar de hoja"
Publicado por: espada en Julio 09, 2010, 04:47:50 am
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.

Código: [Seleccionar]
<?php
   $dbh 
mysql_connect('localhost''usuario''contraseña');
   
mysql_select_db('sensei_blog'$dbh);
   
$start = (empty($_REQUEST["start"]) ? : ($_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.