Ver Mensaje Individual
  #3 (permalink)  
Antiguo 27/07/2006, 06:11
Cluster
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 4 meses
Puntos: 129
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.