Foros del Web » Programando para Internet » PHP »

Impedir que se reenvíen los datos al regargar la página

Estas en el tema de Impedir que se reenvíen los datos al regargar la página en el foro de PHP en Foros del Web. Hola, estoy haciendo una pequeña aplicación web en PHP que realiza inserciones en tablas de un servidor MySQL y no quiero que al pulsar F5 ...
  #1 (permalink)  
Antiguo 12/01/2009, 20:30
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 15 años, 6 meses
Puntos: 1
Impedir que se reenvíen los datos al regargar la página

Hola, estoy haciendo una pequeña aplicación web en PHP que realiza inserciones en tablas de un servidor MySQL y no quiero que al pulsar F5 o al recargar la página se me vuelvan a insertar registros, quiero impedir esto, ¿cómo puedo llevarlo a cabo?

Me sale este mensaje al recargar la página:



Saludos.
  #2 (permalink)  
Antiguo 12/01/2009, 20:35
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Impedir que se reenvíen los datos al regargar la página

has un header() redirigiendo hacia el mismo script... eso limpia el POST
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 12/01/2009, 20:37
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Impedir que se reenvíen los datos al regargar la página

¿Al final de mi script?
  #4 (permalink)  
Antiguo 12/01/2009, 20:43
Avatar de ElJavista
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: Lima Perú
Mensajes: 2.231
Antigüedad: 17 años, 1 mes
Puntos: 67
Respuesta: Impedir que se reenvíen los datos al regargar la página

Si, eso es un problema, si quieres evitar que se muestre ese mensaje lo que tienes que hacer es cargar de nuevo la página después que se guarde el registro, eso lo podrías hacer el mismo PHP pero tendrías que poner el código que guarda en las primeras líneas del script antes de imprimir cualquier cosa. Se haría de este modo:

$sql = "..."; //Sentencia SQL con la que haces la inserción de datos.
if (mysql_query($sql)) {
header("location: pagina.php");
}

Obviamente "pagina.php" debe ser el mismo archivo que se está ejecutando. Acuérdate que no puedes usar la función header después de alguna impresión, así que se supone que más arriba no debe haber ninguna impresión, solamente el código que coge los datos y los guarda.

Bien, eso hará una recarga al guardarse, demorará un poco más en cargar la página porque primeramente se ejecutará el código hasta que se haga la inserción del registro y después volverá a cargarse la página, pero ahora cuando se recargue la página no se volverán a enviar los datos. Espero que te sirva.
  #5 (permalink)  
Antiguo 12/01/2009, 20:47
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Impedir que se reenvíen los datos al regargar la página

Me sale este error de Firefox:

Código:
La página no está redirigiendo adecuadamente

Firefox ha detectado que el servidor está redirigiendo la solicitud a esta dirección de una manera en la que nunca terminará.
  #6 (permalink)  
Antiguo 12/01/2009, 20:56
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Impedir que se reenvíen los datos al regargar la página

Cita:
Iniciado por letni Ver Mensaje
[...] el servidor está redirigiendo la solicitud a esta dirección de una manera en la que nunca terminará [...]
bueno, debes ponerlo... donde de la instrucción que verifica el POST.... si no, nunca saldrás de ahí!!!

(de modo de que solo ocurra si hay POST, solo una ves)

Código PHP:
if ( ! empty($_POST))
{
  
header('Location: pagina.php');

usa la cabeza!!! (eso significa header... jeje)
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 12/01/2009, 21:07
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 15 años, 6 meses
Puntos: 1
Sonrisa Respuesta: Impedir que se reenvíen los datos al regargar la página

Me sigue sin funcionar, tengo este código php:

archivo.php:

Código PHP:
<?php
   
if (!empty($_POST)) {
      
header('Location: archivo.php');
   } 
   
$link mysql_connect("localhost""user""0000");
   
mysql_select_db("Prueba"$link);
   
$Select mysql_query("select * from Producto");
   
// Inserciones varias...
   
echo "Inserciones realizadas";
?>
¿Qué hago mal? Te prometo que estoy usando la cabeza.

Saludos.
  #8 (permalink)  
Antiguo 12/01/2009, 21:20
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Impedir que se reenvíen los datos al regargar la página

ponlo al final.. del script??
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 12/01/2009, 21:25
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Impedir que se reenvíen los datos al regargar la página

Cita:
Iniciado por pateketrueke Ver Mensaje
ponlo al final.. del script??
Ahora tengo esto:

archivo.php

Código PHP:
<?php
   $link 
mysql_connect("localhost""user""0000");
   
mysql_select_db("Prueba"$link);
   
$Select mysql_query("select * from Producto");
   
// Inserciones varias...
   
if (!empty($_POST)) {
      
header('Location: archivo.php');
   } 
   echo 
"Inserciones realizadas";
?>
y me lo sigue insertando de nuevo...
  #10 (permalink)  
Antiguo 12/01/2009, 21:27
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Impedir que se reenvíen los datos al regargar la página

quita los "echo" o cualquier salida antes del header...

¿para que imprimir, si vas a re direccionar???
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #11 (permalink)  
Antiguo 12/01/2009, 21:30
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Impedir que se reenvíen los datos al regargar la página

Cita:
Iniciado por pateketrueke Ver Mensaje
quita los "echo" o cualquier salida antes del header...

¿para que imprimir, si vas a re direccionar???
Los "echo" los tengo después del header y me lo sigue insertando de nuevo.
  #12 (permalink)  
Antiguo 12/01/2009, 21:30
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Impedir que se reenvíen los datos al regargar la página

$_POST es un array, por lo tanto empty() no funciona! Debes usar is_array() o isset(). Por otro lado, las inserciones deben ir dentro del if, pues sólo deben ocurrir si se viene del formulario (POST) no?

  #13 (permalink)  
Antiguo 12/01/2009, 21:34
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Impedir que se reenvíen los datos al regargar la página

Cita:
Iniciado por okram Ver Mensaje
[...] $_POST es un array, por lo tanto empty() no funciona [...]
de hecho, si funciona !!!

mira, hice esta prueba (para desmentirme)

Código PHP:
<?php

$foo 
= array(1);

echo empty(
$foo)? -11;
echo 
'<br />';
echo empty(
$_GET)? -22;
echo 
'<br />';
echo empty(
$_POST)? -33;

?>
y esto sale....

Código:
1
-2
-3
osea... que si esta vacío el array, debe estar "empty" jeje... ¿eso significa no???
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #14 (permalink)  
Antiguo 12/01/2009, 21:37
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Impedir que se reenvíen los datos al regargar la página

¿Entonces mi código debería de quedar así?

Código PHP:
<?php
   $link 
mysql_connect("localhost""user""0000");
   
mysql_select_db("Prueba"$link);
   
$Select mysql_query("select * from Producto");
   if (!empty(
$_POST)) {
      
// Inserciones varias...
      
header('Location: archivo.php');
   } 
   echo 
"Inserciones realizadas";
?>
  #15 (permalink)  
Antiguo 12/01/2009, 21:38
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Impedir que se reenvíen los datos al regargar la página

Cita:
Iniciado por pateketrueke Ver Mensaje
[...] ¿para que imprimir, si vas a re direccionar??? [...]
pues... si, así esta bien...

pero debería quedar así...

Código PHP:
<?php
   
if (!empty($_POST)) {

     
$link mysql_connect("localhost""user""0000");
     
mysql_select_db("Prueba"$link);

     
$Select mysql_query("select * from Producto");

      
// Inserciones varias...
      
header('Location: archivo.php');

   } 
?>
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #16 (permalink)  
Antiguo 12/01/2009, 21:45
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Impedir que se reenvíen los datos al regargar la página

¡Por fin! Ya no me lo vuelve a insertar, te debo una muy grande pateketrueke.

Saludos.
  #17 (permalink)  
Antiguo 12/01/2009, 23:24
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Impedir que se reenvíen los datos al regargar la página

Cita:
Iniciado por pateketrueke Ver Mensaje
osea... que si esta vacío el array, debe estar "empty" jeje... ¿eso significa no???
Como ambos decimos cual Padre Nuestro: "Funciona, pero no es lo correcto". empty() sirve para verificar el contenido de una variable tipo string. Si le pasas como argumento un array, por ejemplo, entonces el intérprete de PHP trata de convertir esta variable en un string.

Ahora, trata de imprimir un array ($arr) haciendo simplemente echo $arr;. Obtienes la palabra "Array", y eso no significa que $arr sea un string que tiene como contenido esa palabra, sino que el intérprete en un intento por ejecutar lo que el código le pide le asigna ese valor.

Dado que $_POST es un array que se "crea" sólo cuando el request fue de tipo POST, empty($_POST); será verdadero cuando el array $_POST no existe, y eso sucederá cuando el request no fue POST. Es como querer hacer un empty($foo) cuando $foo no está seteada.

Si el request es de tipo POST, entonces $_POST existe y es un array. empty($_POST) devolverá entonces falso, pues es el equivalente de empty("Array");. Si me entendiste, te darás cuentas que nada tiene que ver con número de elementos o cosas así.

Te pongo otro similar. $query = mysql_query('...');. Si la query fue exitosa entonces empty($query) devolverá falso, pues es equivalente a empty("Resource #N");. Por el contrario, si la query es incorrecta, $query tomará el valor de false, y empty(false) es verdadero. Igual funciona si queremos verificar la ejecución de X consulta no?

Hombre, qué simple que es PHP, si empty() nos hace todo

  #18 (permalink)  
Antiguo 13/01/2009, 07:09
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Impedir que se reenvíen los datos al regargar la página

@okram, ¿entonces la forma correcta sería así?

Código PHP:
<?php
   
if (isset($_POST)) {

     
$link mysql_connect("localhost""user""0000");
     
mysql_select_db("Prueba"$link);

     
$Select mysql_query("select * from Producto");

      
// Inserciones varias...
      
header('Location: archivo.php');

   } 
?>
Saludos.
  #19 (permalink)  
Antiguo 13/01/2009, 09:09
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Impedir que se reenvíen los datos al regargar la página



@okram, del manual de PHP ..... y eso, que nunca lo leo... jeje

Cita:
empty

(PHP 4, PHP 5)

empty — Determinar si una variable está vacía
Descripción

bool empty ( mixed $var )

Determinar si una variable es considerada vacía.
Lista de parámetros

var

Variable a verificar

Note: empty() sólo chequea variables ya que cualquier otra cosa producirá un error de intérprete. En otras palabras, lo siguiente no funcionará: empty(trim($name)).

empty() es el opuesto de (boolean) var, con la excepción de que no se genera una advertencia cuando la variable no está definida.

Valores retornados

Devuelve FALSE si var tiene un valor no vacío y diferente de cero.

Las siguientes expresiones son consideradas como vacías:

* "" (una cadena vacía)
* 0 (0 como un entero)
* "0" (0 como una cadena)
* NULL
* FALSE
* array() (una matriz vacía)
* var $var; (una variable declarada, pero sin un valor en una clase)
y haciendo énfasis....

Cita:
* array() (una matriz vacía)
por eso, PHP es un lenguaje de scripting.... ¿es fácil no??

Cita:
Iniciado por okram Ver Mensaje
[...] qué simple que es PHP, si empty() nos hace todo [...]
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #20 (permalink)  
Antiguo 13/01/2009, 12:41
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Impedir que se reenvíen los datos al regargar la página

Lei el manual unos momentos despues de publicar el mensaje, pero ya estaba de salida y me corregí. Gracias por la aclaración.

Por otro lado, el que $_POST esté vacío significa que el request definitivamente no fue tipo POST? Digo, no puede haber $_POST con 0 elementos? Ahora sólo voy de paso y no puedo probar. Pero tengo mis dudas acerca de que empty($_POST) sirva para determinar el tipo de request de X script

  #21 (permalink)  
Antiguo 13/01/2009, 13:09
 
Fecha de Ingreso: junio-2007
Ubicación: Mérida, Yucatán, México
Mensajes: 94
Antigüedad: 16 años, 10 meses
Puntos: 1
Respuesta: Impedir que se reenvíen los datos al regargar la página

empty() funciona muy bien...

Sin embargo si mi $var = 0; empty() pensará que esta vacía, sólo por que su valor es 0 (igual lo hace con "0" -entre comillas-) asi que...

...
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 20:55.