Foros del Web » Programando para Internet » PHP »

Anterior y siguiente???

Estas en el tema de Anterior y siguiente??? en el foro de PHP en Foros del Web. Buenas, tengo una duda y espero que me puedan ayudar con ella. la duda es la siguiente: estoy haciendo algo asi como un "Paginador", y ...
  #1 (permalink)  
Antiguo 22/06/2004, 18:07
 
Fecha de Ingreso: septiembre-2003
Ubicación: Pirexia
Mensajes: 150
Antigüedad: 14 años, 3 meses
Puntos: 1
Mensaje Anterior y siguiente???

Buenas, tengo una duda y espero que me puedan ayudar con ella. la duda es la siguiente: estoy haciendo algo asi como un "Paginador", y quisiera agregarle dos botones que digan "anterior" y "siguiente", que por ejemplo, si estamos usando un sistema de noticias, al leer una noticia salgan los botones, y al darle a siguiente vayamos directo a la noticia que viene despues de la que estamos leyendo...

Realize un codigo para esto, pero tengo algunas fallas. aqui esta el codigo:

Código PHP:
<?
$sql 
mysql_query("SELECT * FROM noticias WHERE id = ".$_GET[id]);
$row mysql_query($sql);

// AQUI COLOCAMOS LA NOTICIA, CON
// TODOS LOS ADORNOS Y DETALLES QUE
// SE QUIERAN COLOCAR...

// Luego colocamos los botones, para esto selecciono
// from noticias where id = id+1

$sql_2 mysql_query("SELECT * FROM noticias WHERE id = ".$_GET[id]+1);
$sig mysql_fetch_array($sql_2);

echo 
"<a href=\"noticias.php?id=$sig[id]\">Siguiente</a>";
?>
todo esto funciona bien, el problema surge cuando por ejemplo, en mi base de datos tengo cuatro noticias, de ids 1, 2, 3, 4 respectivamente, y de pronto se me ocurre borrar la noticia #3. Cuando voy a la noticia #2 y le doy a siguiente esta me envia a "noticias.php?id=3" pero esta noticia ya no existe... como hag para verificar si una noticia existe o no? y de no existir, como hago para pasar a la siguiente?

Gracias. Espero sus ayudas.
__________________
In a world without walls, who needs Windows?
  #2 (permalink)  
Antiguo 23/06/2004, 02:21
 
Fecha de Ingreso: marzo-2004
Ubicación: Extremadura
Mensajes: 206
Antigüedad: 13 años, 8 meses
Puntos: 0
Lo que puedes hacer es pasar el numero de registro por: $_GET['numnoticia'], de la noticia que estes visualizando. De esa manera, pones un enlace al numero de noticia anterior y siguiente:

Código PHP:
if ($_GET['numnoticia'] == "")
{
  $num = 1;
}
else
{
  $num = $_GET['numnoticia'];
}

<a href="<? echo $_SERVER['PHP_SELF']; ?>?id=<? echo $_GET['id']; ?>&numnoticia=<? echo ($num-1); ?>">Anterior</a>
<a href="<? echo $_SERVER['PHP_SELF']; ?>?id=<? echo $_GET['id']; ?>&numnoticia=<? echo ($num+1); ?>">Siguiente</a>
y lo que tienes que hacer, es una consulta del tipo:

Código PHP:
$consul "select * from contenidos limit ".$num.","1"; 

Un saludo
  #3 (permalink)  
Antiguo 24/06/2004, 23:24
 
Fecha de Ingreso: septiembre-2003
Ubicación: Pirexia
Mensajes: 150
Antigüedad: 14 años, 3 meses
Puntos: 1
Si, pero ese es exactamente el problema ke tengo. fijate aqui:

Código PHP:
&numnoticia=<? echo ($num-1); ?>
&numnoticia=<? echo ($num+1); ?>
Yo no puedo asegurar q si estoy en la noticia #3, la siguiente sea la #4 porque puedo haberla borrado por x o y razon... y lo mismo pasa con la anterior. Lo que busco es una forma de comprobar, antes de colocar el link, si la noticia $num+1 existe en la base de datos...

Espero que me puedan ayduar..
__________________
In a world without walls, who needs Windows?
  #4 (permalink)  
Antiguo 25/06/2004, 00:10
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 14 años, 2 meses
Puntos: 4
usa la imaginacion mira, puedes poner una condicionante tu estabas en
supon que estabas en:
noticias.php?id=5

el link siguiente te lleva a:
noticias.php?id=6
buscas la noticia con el id 6 pero si no la encuentras redireccionas a:
noticias.php?id=7
y repites el proceso hasta que encuentres una válida
el unico problema es que hay que especificar un interbalo de noticias, para que no se balla al infinito.

checa
Código PHP:
<? 
$sql 
mysql_query("SELECT * FROM noticias WHERE id = ".$_GET[id]); 
$row mysql_query($sql); 

  
// si encontro al menos un resultado
if(mysql_num_rows($row)){
// AQUI COLOCAMOS LA NOTICIA, CON 
// TODOS LOS ADORNOS Y DETALLES QUE 
// SE QUIERAN COLOCAR... 

// Luego colocamos los botones, para esto selecciono 
// from noticias where id = id+1 

$sql_2 mysql_query("SELECT * FROM noticias WHERE id = ".$_GET[id]+1); 
$sig mysql_fetch_array($sql_2); 

echo 
"<a href=\"noticias.php?id=$sig[id]\">Siguiente</a>"

  
//si no encontro resultados osea si se elimino la noticia
}else{
  
$referer $HTTP_REFERER;
  list(
$archivo,$getstr) = split("?",$referer); 
  list(
$varname,$value) = split("=",$getstr);  //solo si hay una variable get
  
$intvalue = (int) $value;
  if(
$intvalue $_GET["id"]){
    
$x = -1;
  }else{
    
$x 1;
  }

  
si no encontro resultados
  header
("location: noticias.php?id=$x")
}
?>

Última edición por xcorpion; 25/06/2004 a las 00:22 Razón: siempre se me pasa uno que otro detalle
  #5 (permalink)  
Antiguo 25/06/2004, 00:24
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 14 años, 2 meses
Puntos: 4
otra seria, mantener un indice de los articulos que tienes separadoas por comas y almacenarlos en una base de datos o en un archivo del tipo:

1,2,3,4,7,12,13,15,20,21,22,26..

pero tendrias que actualizarlo cada ves que eliminaras y agregaras articulos
  #6 (permalink)  
Antiguo 25/06/2004, 00:26
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 14 años, 2 meses
Puntos: 4
otra mas factible seria que no eliminaras noticias, si no que las marcaras como eliminadas en algun campo, asi podrias reutilizar los registros sin eliminarlos, como la tecnica de programacion famosa llamada reciclaje de registros.
  #7 (permalink)  
Antiguo 25/06/2004, 02:10
 
Fecha de Ingreso: marzo-2004
Ubicación: Extremadura
Mensajes: 206
Antigüedad: 13 años, 8 meses
Puntos: 0
Una cosa, Volrath: la forma en la que tu lo haces, es pasandole el identificador que tiene una noticia en la base de datos, y asi sí que es un problema el hecho de borrar la noticia, porque no la encontrará:
Cita:
$sql = mysql_query("SELECT * FROM noticias WHERE id = ".$_GET[id]);
Pero la forma que yo te he puesto, no es buscando por el identificador, sino por la posición que ocupa la noticia en la base de datos:
Cita:
$sql = mysql_query("select * from noticias limit ".$num.","1");

Un saludo
  #8 (permalink)  
Antiguo 25/06/2004, 11:46
Avatar de xcorpion  
Fecha de Ingreso: octubre-2003
Ubicación: m é x i c o
Mensajes: 676
Antigüedad: 14 años, 2 meses
Puntos: 4
tambien puedes hacer una seleccion de los ids y pasarlos a un array para saber cual id es el siguiente o el anterior.
  #9 (permalink)  
Antiguo 25/06/2004, 14:45
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
Hola,

Bueno, tambien podrias hacer 2 consultas mas entu pagina para sacar los id reales de la anterior y de la siguiente. Serian:

SELECT id FROM tabla WHERE id>$id_mostrada ORDER BY id ASC LIMIT 1 // siguiente
SELECT id FROM tabla WHERE id<$id_mostrada ORDER BY id DESC LIMIT 1 // anterior

Si alguna no te devuelve resultado, no pones el link.

Otra opcion seria pasar el $id_mostrada y otra variable que diga si quieres sacar el anterior o el siguiente. Por ejemplo, estas mostrando la noticia de id=6, pondrias un link como:

noticia.php?id=6&accion=anterior
noticia.php?id=6&accion=siguiente

En funcion del valor recibido en accion usas la consulta de antes para mostrar la noticia.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #10 (permalink)  
Antiguo 25/06/2004, 21:36
 
Fecha de Ingreso: septiembre-2003
Ubicación: Pirexia
Mensajes: 150
Antigüedad: 14 años, 3 meses
Puntos: 1
Muchas gracias a todos, he encontrado la solucion gracias a cada una de las respuestas...

Salu2x.
__________________
In a world without walls, who needs Windows?
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:55.