Foros del Web » Programando para Internet » PHP »

Problema con cabeceras

Estas en el tema de Problema con cabeceras en el foro de PHP en Foros del Web. Hola a todos! Estoy creando un libro de visitas en PHP y tengo un problema con las cabeceras. En concreto, es un script autoprocesado. Si ...
  #1 (permalink)  
Antiguo 22/04/2003, 06:05
Avatar de xavigu  
Fecha de Ingreso: diciembre-2002
Ubicación: Barcelona (España)
Mensajes: 48
Antigüedad: 15 años
Puntos: 0
Problema con cabeceras

Hola a todos!

Estoy creando un libro de visitas en PHP y tengo un problema con las cabeceras.

En concreto, es un script autoprocesado.

Si no existe la variable "enviar" del formulario, simplemente muestra las entradas del libro de visitas hasta el momento, en caso contrario, realiza una inserción en la base de datos de turno y muestra las entradas del libro de visitas con el último registro introducido.

En si, el script funciona correctamente pero al actualizar la página me duplica los mensajes porque los datos estan en la cabecera de la misma.

Mo se como evitar este problema y me estoy volviendo loco

Si alguien me puede dar una idea de por donde empezar a solucionar el problema, estaría muy agradecido.

Salud,

Xavigu
  #2 (permalink)  
Antiguo 22/04/2003, 06:13
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
Hola,

Solucion: separar la pagina que graba el registro del que muestra las entradas. No es necesario que este en distintos ficheros, simplemente que sea como cargar otra pagina.

En pseudocodigo:

si se ha enviado el formulario
grabar la entrada en la bd
redireccionar al codigo que muestra
si no se ha enviado el formulario
formulario con los datos
mostrar todas las entradas

La redireccion seria un header("Location: "); exit;. Con esto logras que al actualizar, solo se vuelva a ejecutar el codigo que muestra las entradas, no el que las graba.

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #3 (permalink)  
Antiguo 22/04/2003, 06:15
Avatar de Cain  
Fecha de Ingreso: enero-2002
Ubicación: Catalunya
Mensajes: 6.459
Antigüedad: 15 años, 11 meses
Puntos: 17
Pon una página intermedia.

Ejemplo:

formulario-->Inserción en Base de datos-->formulario

Así, la cabecera de la página final no llamará a las líneas que insertan los datos.
__________________
M a l d i t o F r i k i
  #4 (permalink)  
Antiguo 22/04/2003, 06:24
 
Fecha de Ingreso: agosto-2002
Ubicación: Colón - Entre Rios - Argentina
Mensajes: 647
Antigüedad: 15 años, 4 meses
Puntos: 8
Para que una pag. no quede en el cache del navegador usa header( "Pragma: no-cache" );
Pero ¿dices que los registros se duplican? O sea que aparecen 2 veces cada uno... no creo que sea problema de headers (¿o cuando dices cabeceras te refieres a el sector superior de tu pagina o algo asi?)
Si es esto último agrega una condicion
Código PHP:
 if (isset($enviar)) { 
// no listes las entradas del libro de visitas ya que las vas a mostrar mas adelante y ya actualizadas...

Perdona si no tiene nada que ver con lo que necesitas, es que no entendi muy bien que digamos...

Saludos!
  #5 (permalink)  
Antiguo 22/04/2003, 06:26
Avatar de xavigu  
Fecha de Ingreso: diciembre-2002
Ubicación: Barcelona (España)
Mensajes: 48
Antigüedad: 15 años
Puntos: 0
Cita:
Mensaje Original por josemi


En pseudocodigo:

si se ha enviado el formulario
grabar la entrada en la bd
redireccionar al codigo que muestra
si no se ha enviado el formulario
formulario con los datos
mostrar todas las entradas

La redireccion seria un header("Location: "); exit;. Con esto logras que al actualizar, solo se vuelva a ejecutar el codigo que muestra las entradas, no el que las graba.

Suerte.
No puedo utilizar header("location: ") porque ya se han enviado información a la cabecera. Por lo que estoy viendo, por el momento, parece mejor opción la de dividir el libro de visitas en dos scripts. Uno de presentación y otro de acceso a base de datos.

Gracias a todos,

Xavigu
  #6 (permalink)  
Antiguo 22/04/2003, 06:58
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
Pues reorganiza (refactoriza, segun XP) tu codigo para que el codigo de grabar la entrada se ejecute antes de enviar otras cabeceras.

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #7 (permalink)  
Antiguo 22/04/2003, 07:07
Avatar de xavigu  
Fecha de Ingreso: diciembre-2002
Ubicación: Barcelona (España)
Mensajes: 48
Antigüedad: 15 años
Puntos: 0
Cita:
Mensaje Original por fran86

Pero ¿dices que los registros se duplican? O sea que aparecen 2 veces cada uno... no creo que sea problema de headers (¿o cuando dices cabeceras te refieres a el sector superior de tu pagina o algo asi?)

El problema en si es que, después de introducir un nuevo mensaje en el libro mediante el metodo post desde un formulario, si actualizas la página....

Por ej. CTRL+R en mozilla ó F5 en explorer.

Vuelves a enviar las cabeceras HTTP a la página y se inserta de nuevo el mensaje introducido anteriormente, tantas veces como actualizes la página.
  #8 (permalink)  
Antiguo 22/04/2003, 07:26
 
Fecha de Ingreso: agosto-2002
Ubicación: Colón - Entre Rios - Argentina
Mensajes: 647
Antigüedad: 15 años, 4 meses
Puntos: 8
Y suponiendo que usas DB has una consulta donde verifiques si hay una entrada igual a la que intentan introducir...
Código PHP:
$q mysql_query("SELECT COUNT(*) FROM tabla WHERE campo = 'lo que te mandan del formulario'");
if( 
mysql_result($q0)) {
    
// no insertar
} else {
    
// insertar

Un saludo.
  #9 (permalink)  
Antiguo 22/04/2003, 12:36
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Bueno .. yo soy de la opinion de:

Formulario --> procesa el formulario datos (los metes a tu BD o haces lo que tengas que hacer)
--> si todo OK .. redireccionas a otra pagina
<-- si hay algun error redireccionas a tu formulario (pasandole las variables q enviastes para rellenar los "value" de los <input> ..

Si tienes problemas con usar "header()" para redireccionar .. siempre puedes usar redireccion javascript o META de refresco (preguna en el foro Javascript o HTML para q te orienten ..)

Pero lo ideal es que PIENSES como funciona PHP y como se "compone" tu código HTML desde PHP para que "reorganices" tu código pensando que estas progamado en PHP y es PHP el que manda sobre el HTML q genere y no en HTML con PHP (como así parece) ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #10 (permalink)  
Antiguo 23/04/2003, 03:53
Avatar de xavigu  
Fecha de Ingreso: diciembre-2002
Ubicación: Barcelona (España)
Mensajes: 48
Antigüedad: 15 años
Puntos: 0
En resumen, el código de la página es este:

----------------
if(isset($HTTP_POST_VARS["enviar"])) {

inserción en mysql
header("location ./guestbook");

}

include(head)
sacamos firmas del libro de visitas

formulario para introducir mensaje

include (base)

----------------

Antes la inclusión - include(head) - de código de menús, javascript, etc. que había en la página estaban colocados antes del "if". Ahora los coloqué debajo y la función header funciona correctamente. Me lo miraré con más detenimiento porque, en teoría, no hay nada que envie datos a la cabecera. Lo único que se me acude que puede ser es:

<head>
<title>lalalala</title>
<script>javascript de turno</script>
link al archivo de css
</head>

Muchas gracias a todos por su ayuda,

Xaxigu
  #11 (permalink)  
Antiguo 23/04/2003, 11:13
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Código PHP:
<?
if(isset($HTTP_POST_VARS["enviar"])) {

inserción en mysql
header
("location: ./guestbook");
exit; 
// importante terminar la ejecución de tu script .. sino se ejecuta el include()  q tienes a continuación ...Pese que el "location" le esté diciendo al navegador que cambie a la página que le indicas .. Tambien te faltó : en el location:
}

include(
'head.tal');
// sacamos firmas del libro de visitas

// formulario para introducir mensaje

include ('base.tal');
?>
Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #12 (permalink)  
Antiguo 28/04/2003, 03:54
Avatar de xavigu  
Fecha de Ingreso: diciembre-2002
Ubicación: Barcelona (España)
Mensajes: 48
Antigüedad: 15 años
Puntos: 0
Cita:
Mensaje Original por Cluster
Código PHP:
<?

inserción en mysql
header
("location: ./guestbook");
exit; 
// importante terminar la ejecución de tu script .. 
?>
Muchas gracias por toda la información facilitada. Ahora el script de perlas. La instrucción exit, efectivamente es muy importante para parar la ejecución del script porque, en caso contrario, continua asta el final del script.

Salud,

Xavi
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 16:19.