Foros del Web » Programando para Internet » PHP »

Desface en actualizar y botón sensible

Estas en el tema de Desface en actualizar y botón sensible en el foro de PHP en Foros del Web. Hola, tengo dos nuevas dudas: Después de hacer algunas cosas, en todas topé en lo mismo, así que hice algo corto para ilustrar mis dudas. ...
  #1 (permalink)  
Antiguo 26/07/2006, 11:40
 
Fecha de Ingreso: julio-2006
Mensajes: 50
Antigüedad: 11 años, 5 meses
Puntos: 0
Desface en actualizar y botón sensible

Hola, tengo dos nuevas dudas:
Después de hacer algunas cosas, en todas topé en lo mismo, así que hice algo corto para ilustrar mis dudas.

1- Si presiono un botón y luego actualizo la página (F5), al actualizarse, hace como si volviera a apretar de nuevo ese mismo botón.
Por ejemplo si uno compra 10 kilos de manzanas, y luego actualiza la página, hace como si comprara otros 10 kilos.
2- Los datos se actualizan después, es decir compro un kilo de peras pero no me muestra que tengo el kilo de peras más hasta la próxima actualización de la página.


Para que se entienda mejor, este es la dirección: (aún no tengo permiso para poner enlaces)
www2.udec.cl/~bkarelovic/fruteria2.php

Y acá va el código (no es necesario revisar para entender, si no el oren importa), pero no logro entender por qué se demora en actualizar si todo aparentemente está en orden:
- Carga los valores
- Modifica los valores
- Guarda los valores
- Recarga la página.

Código PHP:
<html>

<?php

$f
=fopen("frutas.txt","r");    /* cargar datos */
$aux=fgets($f);
$aux=split(";",$aux);
$man=$aux[0];
$per=$aux[1];
$din=$aux[2];
fclose($f);

echo <<<EOT

Manzanas: $man<br>
Peras: $per<p>

Dinero: $din<br>

EOT;

$nman=$_POST['nman'];
$nper=$_POST['nper'];


if(isset(
$_POST['c_man']))
 {
 echo 
"Compraste ".$_POST['nman']. " manzanas";
 
$man=$man+$_POST['nman'];
 
$din=$din-$_POST['nman']*100;
 }
if(isset(
$_POST['c_per']))
 {
 echo 
"Compraste ".$_POST['nper']. " peras";
 
$per=$per+$_POST['nper'];
 
$din=$din-$_POST['nper']*100;
 }
if(isset(
$_POST['nuevo']))
 {
 
$din=20000;
 
$per=10;
 
$man=10;
 }
  
            
$f=fopen("frutas.txt","w+");        /* guardar datos*/
fputs($f,$man.";".$per.";".$din);
fclose($f);

?>

<form action="fruteria2.php" method="post">
<input type="submit" value="Comprar" name="c_man"> <input type="text" size="2" name="nman"> kilos de manzanas. ($100 el kilo)
</form><p>

<form action="fruteria.php" method="post">
<input type="submit" value="Comprar" name="c_per"> <input type="text" size="2" name="nper"> kilos de peras. ($150 el kilo)
</form>

<form action="fruteria.php" method="post">
<input type="submit" value="Empezar de nuevo" name="nuevo">
</form>




</html>

Y aprovecho de hacer otra pregunta, que estoy buscando una función y no la encuentro.
Cuál es la función para enviarnos a otra página?

Muchas gracias por la paciencia.

Última edición por Cluster; 27/07/2006 a las 06:58
  #2 (permalink)  
Antiguo 26/07/2006, 23:58
 
Fecha de Ingreso: julio-2006
Mensajes: 50
Antigüedad: 11 años, 5 meses
Puntos: 0
Ojalá no los haya asustado con tanto código...
  #3 (permalink)  
Antiguo 27/07/2006, 07:11
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Iniciado por Krunoslav
Ojalá no los haya asustado con tanto código...
No, no asusta .. pero si en lugar de una cita usas el botón "PHP" queda más claro el código (ya te lo hice yo).

El problema que experimentas no es por "botón sensible" (PHP no entiende de "botones" y si se pulsan o no ...).

Lo que sucede es que NO separas procesos. Tienes el mismo proceso de ingreso de datos (formulario) en el mismo proceso que el que registra el dato (la parte PHP). Esto no quiere decir que se tenga que separa el código físicamente en -dos- scripts .. pero tal vez en "dos scripts" queda más evidente lo que te voy a comentar:

Si tienes un formulario X con método POST .. si tu recargas la página el navegador entiende que debe re-enviar las mismas variables que envió antes. Por eso con una recarga de página se origina una nueva ejecución del script y en consecuencia por lo que hace tu código, se crea un nuevo registro en tu archivo de texto plano.

La solución es que debes "separar" el proceso de escritura de datos del que los ingresa ...

Debes detectar que tu script está en el proceso o debe ejecutar el proceso de registro de datos .. en tu caso ya que usas un formulario y envias datos a este mismo script lo harías revisando la existencia o valor de alguna de tus varaibles del formulario .. por ejemplo .. las del "submit" o cualquier otra .. Al terminar el proceso, redireccionas a si mismo .. así el navegador "pierde" toda variabel en POST que le pueda llegar .. si recargas la página ya no estará el navegador "cargado" con esas variables ...

Código PHP:
if ($_POST['submit'] == "Comprar"){

// tu lógica del cálculo y demás ...             

$f=fopen("frutas.txt","w+");        /* guardar datos*/ 
fputs($f,$man.";".$per.";".$din); 
fclose($f);

// redireccionas a este mismo script .. 
header("Location: ".$_SERVER['PHP_SELF']);
exit;

Por otro lado .. en scripts que tienen que hacer vários procesos, lease:
1) toma de datos (un formulario)
2) procesos vários: ingreso de datos, actualizar datos .. etc

En esos casos se usan variables de "control" para indicar el estado en forma más evidente para identificar el proceso en que estamos ..

Ejemplo:

Código PHP:
switch($_POST['accion']){
  case 
"registrar":
    
// aquí tu código de registro de datos ..
  
break;
  case 
"borrar":
    
// aquí tu código de borrado de datos ..
  
break;
  default:
     
// aquí tu código del formulario para ingreso de datos o listado de datos, estado "inicial" al llamar al script sin haber definido un estado.
    // Tu formulario en este caso tendría una variable oculta (hidden) tipo
    // <input type="hidden" name="estado" value="registrar">
    // Y lo mismo con otras "acciones" que tu script haga ..
   

Ten presente que en realidad estás generando un "script" PHP que a su vez en ciertos estados va a generar algún tipo de salida: página HTML (como la necesaria para componer tu formulario HTML) y en otros casos NO corresponde "salida" alguna . .(caso del "proceso puro" de insercción de datos o borrado y similares) ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #4 (permalink)  
Antiguo 28/07/2006, 21:25
 
Fecha de Ingreso: julio-2006
Mensajes: 50
Antigüedad: 11 años, 5 meses
Puntos: 0
Muchas gracias por tu respuesta, probé con otro script y no tuve ninguno de los dos problemas.

Pero con el de las peras y manzanas sí: al poner los "header". Me arrojó el error: "Cannot modify header information - headers already sent....". Según me dijo San Google, era porque ya había enviado código html, entonces tenía que ponerlo antes de cualquier código html.
¿Es verdad eso? Porque entonces... ¿Qué trucos hay que hacer para poder poner el header(Loca..) antes de cualquier html? ¿existe algún truco o estaré mal?

Y probé con eliminar las variables al final del formulario (unset), pero igual volvía a enviar los datos al actualizar.

Y una duda a tu respuesta, ¿Cómo le asigno los valores a $_POST['submit'] o al $_POST['accion'] de tus ejemplos para poder ocupar el switch?

Gracias.
  #5 (permalink)  
Antiguo 29/07/2006, 10:08
Avatar de juaniquillo
Colaborador
 
Fecha de Ingreso: noviembre-2005
Ubicación: San Juan, Puerto Rico
Mensajes: 5.745
Antigüedad: 12 años
Puntos: 281
el problema es el que dices exactamente. Lo mas probable es que tienes un espacio en blanco en el html. Puedes tener espacios en blando en el codigo php (el codigo que esta entre los tags <?php y ?>), pero no puedes tener espacios en blanco fuera del codigo php antes de un header.
__________________
Por fin.. tengo algo parecido a un blog
Y por lo visto ya estoy escribiendo...
  #6 (permalink)  
Antiguo 31/07/2006, 08:13
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Iniciado por Krunoslav
Muchas gracias por tu respuesta, probé con otro script y no tuve ninguno de los dos problemas.

Pero con el de las peras y manzanas sí: al poner los "header". Me arrojó el error: "Cannot modify header information - headers already sent....". Según me dijo San Google, era porque ya había enviado código html, entonces tenía que ponerlo antes de cualquier código html.
¿Es verdad eso? Porque entonces... ¿Qué trucos hay que hacer para poder poner el header(Loca..) antes de cualquier html? ¿existe algún truco o estaré mal?

Y probé con eliminar las variables al final del formulario (unset), pero igual volvía a enviar los datos al actualizar.

Y una duda a tu respuesta, ¿Cómo le asigno los valores a $_POST['submit'] o al $_POST['accion'] de tus ejemplos para poder ocupar el switch?

Gracias.
Lo mejor es que indiques el código completo que te quedó (todos los involucrados) .. Indica el mensaje de error (sobre header()) que tienes, el mensaje de error dice exactamente donde está el problema (en que script y en que línea se originan las "salidas" que marca error al usar header()) .. Ahí será mejor recomendarte como re-componer tu código si corresponde.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #7 (permalink)  
Antiguo 04/08/2006, 18:33
 
Fecha de Ingreso: julio-2006
Mensajes: 50
Antigüedad: 11 años, 5 meses
Puntos: 0
Al comprar n manzanas, me dice:

Compraste 10 manzanas
Warning: Cannot modify header information - headers already sent by (output started at C:\wamp\www\fruteria2.php:22) in C:\wamp\www\fruteria2.php on line 23

Código PHP:
<?php

$f
=fopen("frutas.txt","r");        // Cargar Datos
$aux=fgets($f);
$aux=split(";",$aux);
$man=$aux[0];
$per=$aux[1];
$din=$aux[2];
fclose($f);

/* echo <<<EOT                //Mostrar lo que tiene
Manzanas: $man<br>
Peras: $per<p>
Dinero: $din<br>
EOT; */

if(isset($_POST['c_man']))        //Si compra Manzanas
 
{
 
 
$man=$man+$_POST['nman'];
 
$din=$din-$_POST['nman']*100;
 echo 
"Compraste ".$_POST['nman']. " manzanas";
 
header("Localion :".$_SERVER['PHP_SELF']);  // <--- Línea 23
 
exit;
 }
if(isset(
$_POST['c_per']))        //Si compra peras
 
{

 
$per=$per+$_POST['nper'];
 
$din=$din-$_POST['nper']*100;
 echo 
"Compraste ".$_POST['nper']. " peras";
 
header("Localion :".$_SERVER['PHP_SELF']);
 exit;
 }
if(isset(
$_POST['nuevo']))        //Si quiere empezar de nuevo
 
{
 
$din=20000;
 
$per=10;
 
$man=10;
 }
  
            
$f=fopen("frutas.txt","w+");        //Guardar Datos
fputs($f,$man.";".$per.";".$din);
fclose($f);



                    
//Formulario
?>                    

<form action="fruteria2.php" method="post">
<input type="submit" value="Comprar" name="c_man"> <input type="text" size="2" 

name="nman"> kilos de manzanas. ($100 el kilo)
</form><p>

<form action="fruteria2.php" method="post">
<input type="submit" value="Comprar" name="c_per"> <input type="text" size="2" 

name="nper"> kilos de peras. ($150 el kilo)
</form>

<form action="fruteria2.php" method="post">
<input type="submit" value="Empezar de nuevo" name="nuevo">
</form>
Qué me recomiendan?
Gracias.
  #8 (permalink)  
Antiguo 04/08/2006, 18:53
Avatar de Nefertiter  
Fecha de Ingreso: enero-2003
Ubicación: Rosario
Mensajes: 1.316
Antigüedad: 14 años, 11 meses
Puntos: 8
no podes hacer :

echo "Compraste ".$_POST['nper']. " peras";
header("Localion :".$_SERVER['PHP_SELF']);

xq producis una salida e inmediatamente redirigis O UNA COSA O LA OTRA

para arreglarlo tnes q quitar el echo y como vos los seguis ejecutando al script te recomiendo despues los de Header agregues un exit();
  #9 (permalink)  
Antiguo 04/08/2006, 18:55
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Se trata de que redirecciones en el caso de que creaas tu registro nuevo .. pero sòlo en ese caso!

No puedes redireccionar y antes mostrar un mensaje de error .. ¿con qué sentido haces eso?. Quita esos "header()" y "exit" de esos if() .. NO corresponden.

Código PHP:
if(isset($_POST['nuevo']))        //Si quiere empezar de nuevo
 
{
 
$din=20000;
 
$per=10;
 
$man=10;
             
$f=fopen("frutas.txt","w+");        //Guardar Datos
fputs($f,$man.";".$per.";".$din);
fclose($f);

header ("Location: ".$_SERVER['PHP_SELF']);
exit;

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
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 13:11.