Foros del Web » Programando para Internet » PHP »

POST se ejecuta al actualizar, ¿como lo evito?

Estas en el tema de POST se ejecuta al actualizar, ¿como lo evito? en el foro de PHP en Foros del Web. Buenas gente... Es simple... el titulo ya lo dice todo, tengo un formulario que va cargando datos a una base de datos... El tema es ...
  #1 (permalink)  
Antiguo 10/07/2008, 11:19
Avatar de [NiRVaNa]  
Fecha de Ingreso: abril-2004
Ubicación: Someplace In The Middle Of Nowhere!
Mensajes: 325
Antigüedad: 20 años
Puntos: 6
Pregunta POST se ejecuta al actualizar, ¿como lo evito?

Buenas gente... Es simple... el titulo ya lo dice todo, tengo un formulario que va cargando datos a una base de datos... El tema es que cuando actualizo la pagina qe me devuelve el post... hace nuevamente la accion...

Tengo algo asi:
Código PHP:
if (($_POST['aceptar']) {
// Inserto en la base de datos
//...

Probe haciendo un unset($_POST['aceptar']); dentro del if... pero nada...

Sugerencias... Gracias..
  #2 (permalink)  
Antiguo 10/07/2008, 11:32
Avatar de T4ke0veR  
Fecha de Ingreso: agosto-2007
Ubicación: Quito - Ecuador
Mensajes: 1.720
Antigüedad: 16 años, 8 meses
Puntos: 28
Respuesta: POST se ejecuta al actualizar, ¿como lo evito?

te hace un insercion en datos??? me muestras tu codigo completo??... ami me paso algo asi y lo solucione!!!
__________________
Diseño gráfico, Web, imagen corporativa, publicidad ...
  #3 (permalink)  
Antiguo 10/07/2008, 11:52
Avatar de [NiRVaNa]  
Fecha de Ingreso: abril-2004
Ubicación: Someplace In The Middle Of Nowhere!
Mensajes: 325
Antigüedad: 20 años
Puntos: 6
Exclamación Respuesta: POST se ejecuta al actualizar, ¿como lo evito?

Te paso, solo hago esos 3 inserts porque lo hago por pasos..

Código PHP:
<?php
    
include("lib/class.upload.php");
    
$primerpaso true;
    
$segundopaso false;
        
    if (
$_POST['primero']) {

        
//Manejo para upload de imagenes, y guardar la direccion en la base de datos
        
$handle = new Upload($_FILES['pic']);
    
        
// then we check if the file has been uploaded properly
        // in its *temporary* location in the server (often, it is /tmp)
        
if ($handle->uploaded) {
    
            
// yes, the file is on the server
            // now, we start the upload 'process'. That is, to copy the uploaded file
            // from its temporary location to the wanted location
            // It could be something like $handle->Process('/home/www/my_uploads/');
            
$upload_dir "src/images/products";
            
$handle->Process('../'.$upload_dir);
            
            
// we check if everything went OK
            
if ($handle->processed) {
                
// everything was fine !
                
$image_info $upload_dir.'/'.$handle->file_dst_name;
            } else {
                
// one error occured
                
die ($handle->error);
            }
         
$handle-> Clean();
        }
        if (
$_POST['name'] == "") die("Nombre es un campo requerido");
        
$sql "insert into products (nombre, foto, estado) values ('";
        
$sql .= $_POST['name']."', '";
        
$sql .= $image_info."', 'borrador')";
        if (
mysql_db_query($db$sql$link)) {
            
$primerpaso false;
            
$segundopaso true;
        } else {
            echo 
mysql_error();
        }
    }
?>
y el form es este:

Código HTML:
<form name="products" method="post" action="?do=products&amp;go=alta" enctype="multipart/form-data">
<table width="100%" border="0">
  <tr>
    <th scope="row"><label>Nombre</label></th>
    <td><input type="text" name="name" /></td>
  </tr>
  <tr>
    <th scope="row"><label>Imagen: </label><input type="file" name="pic"/></th>
    <td><input type="submit" name="primero" value="Agregar" /></td>
  </tr>
</table>
</form> 
Y cuando se procesa el form se muestra esto:
Código HTML:
<img src="../<?php echo $image_info; ?>" alt="Nuevo producto" height="230" width="230" />
<div style="background: #999; font-weight: bold; color: #fff"><?php echo $image_info; ?></div> 
Y en este momento, al darle actualizar es que me carga nuevamente una entrada a la base de datos y me vuelve a subir la imagen...
  #4 (permalink)  
Antiguo 10/07/2008, 11:56
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: POST se ejecuta al actualizar, ¿como lo evito?

Lo que tienes que hacer es al final de ese if que pusiste, hacer un redirect a la misma pagina o a otra pagina, con eso evitas que al actualizar se vuelva a insertar.

El redirect lo puedes hacer con:
Código PHP:
header"Location: pagina.php" ); 
Saludos.
  #5 (permalink)  
Antiguo 10/07/2008, 12:01
Avatar de T4ke0veR  
Fecha de Ingreso: agosto-2007
Ubicación: Quito - Ecuador
Mensajes: 1.720
Antigüedad: 16 años, 8 meses
Puntos: 28
Respuesta: POST se ejecuta al actualizar, ¿como lo evito?

exacto.. seria bueno un redirect despues del insert....!!!
__________________
Diseño gráfico, Web, imagen corporativa, publicidad ...
  #6 (permalink)  
Antiguo 10/07/2008, 22:08
Avatar de [NiRVaNa]  
Fecha de Ingreso: abril-2004
Ubicación: Someplace In The Middle Of Nowhere!
Mensajes: 325
Antigüedad: 20 años
Puntos: 6
Respuesta: POST se ejecuta al actualizar, ¿como lo evito?

Lo probé y funcionaría en algunos casos, pero no en el mio. Ya que como dije lo hago por parte.

1) Subo la foto
2) Muestro la foto que se subio y habilito otro formulario dentro de la misma pagina.php

lo 2 lo hago con unos flags, y al hacer el redirect, se inicializan los valores de los flags...

Algunas otra alternativa?
  #7 (permalink)  
Antiguo 10/07/2008, 22:15
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: POST se ejecuta al actualizar, ¿como lo evito?

Entonces antes de insertar haz una consulta SELECT a la base de datos para ver si ya existe el registro, y si existe no lo insertas.

Saludos.
  #8 (permalink)  
Antiguo 14/07/2008, 10:22
Avatar de [NiRVaNa]  
Fecha de Ingreso: abril-2004
Ubicación: Someplace In The Middle Of Nowhere!
Mensajes: 325
Antigüedad: 20 años
Puntos: 6
Respuesta: POST se ejecuta al actualizar, ¿como lo evito?

Hola gente, de nuevo... Logre solucionar con una mezcla de consejos que encontre aca, haciendo un Header("Location: ....."); y pasando por el get el id del nuevo registro que se inserto, y asi lo verifico.

Peero, ahora tengo otro drama. Al hacer las pruebas localmente funciona todo perfecto. Pero cuando las subi a mi servidor (es un hosting de pago) me tira el error de que las cabeceras ya se han enviado. Sé que esto es porque ya se enviaron cabeceras HTML antes de que yo haga el Header("Location...").

Ahora bien, nose como podria solucionar esto, ya que hay un solo archivo en donde se cargan las porciones de codigo que hacen los inserts, updates, y deletes de la base de datos, y estos obviamente son archivos aparte, los cargo mediante include.

Entonces, como podria solucionar el tema de la redireccion? Porque por mas de que ponga el header() en el inicio de cada archivo, al momento de cargarse en el archivo principal ya se habran enviado algunas cabeceras html.

Les dejo mi codificacion para que vean como funciona...

Código PHP:
<?php
    
include("lib/class.upload.php");
    
$segundopaso false;
        
    if ((
$_POST['primero']) && (!$image_info)) {

        
/*Manejo para upload de imagenes, y guardar la direccion en la base de datos
        ...
        */
        
if ($_POST['name'] == "") die("Nombre es un campo requerido");
        
$sql "insert into products (nombre, foto, estado) values ('";
        
$sql .= $_POST['name']."', '";
        
$sql .= $image_info."', 'borrador')";
        if (
mysql_db_query($db$sql$link)) {
            
$idQ mysql_insert_id();
            
Header("Location: index.php?do=products&go=alta&segundo=true&id=".$idQ);
        } else {
            echo 
mysql_error();
        }
    } else if (
$_POST['segundo']) {
        if (
$_POST['pcontado'] == "" || $_POST['desc'] == "") die("Descripcion y Precio Contadon son campos requeridos");
        
        
$sql "update products set ";
        
$sql .= "descripcion = '".$_POST['desc']."', ";
        
$sql .= "precio_contado = ".$_POST['pcontado'].", ";
        if (
$_POST['cuatroc']) $sql .= "cuatro_cuotas = ".$_POST['cuatrocuotas'].", ";
        if (
$_POST['cincoc']) $sql .= "cinco_cuotas = ".$_POST['cincocuotas'].", ";
        if (
$_POST['ochoc']) $sql .= "ocho_cuotas = ".$_POST['ochocuotas'].", ";
        if (
$_POST['diezc']) $sql .= "diez_cuotas = ".$_POST['diezcuotas'].", ";
        if (
$_POST['docec']) $sql .= "doce_cuotas = ".$_POST['docecuotas'].", ";
        if (
$_POST['quincec']) $sql .= "quince_cuotas = ".$_POST['quincecuotas'].", ";
        
$sql .= "id_categories = ".$_POST['cat'].", ";
        
$sql .= "estado = 'activo' ";
        
$sql .= "where id = ".$_POST['idp'];
        
        if (
mysql_db_query($db$sql$link)) {
            
Header("Location: index.php?do=products&go=alta&ok=true"); //Es esto lo que me genera el error
        
} else {
            echo 
mysql_error();
        }
    }
?>
De no ser posible solucionar esto con header() que otra funcion puedo usar para el redireccionamiento que no sea javascript.

Gracias...
  #9 (permalink)  
Antiguo 14/07/2008, 11:17
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: POST se ejecuta al actualizar, ¿como lo evito?

Hola [NiRVaNa],

El error mismo te dice en que parte de tu código estas enviando las cabeceras, y lo que tendrías que hacer en este caso es verificar esa parte y evitar el envío de las cabeceras.

Saludos.
  #10 (permalink)  
Antiguo 14/07/2008, 11:24
Avatar de [NiRVaNa]  
Fecha de Ingreso: abril-2004
Ubicación: Someplace In The Middle Of Nowhere!
Mensajes: 325
Antigüedad: 20 años
Puntos: 6
Respuesta: POST se ejecuta al actualizar, ¿como lo evito?

A lo mejor no me estan entendiendo o yo no estoy entendiendo... Supongamos que tengo un archivo index.php que se compone asi

Código HTML:
<html>
<head></head>
<body>
<?php
    include("productos.php");
?>
</body>
</html> 
Donde productos es el archivo que contiene el codigo expuesto arriba... Cada vez que esa pagina se actualice o se envie informacion, lo primero que se leerá serán las cabeceras html, y luego empezará a leer lo que esta dentro de "productos.php"... Cierto?

Entonces por mas de que ponga el header() al principio de todo en el archivo "productos.php" en el archivo "index.php" siempre existira codigo html antes del mismo, que por ende se envia primero... Estoy en lo correcto? De no ser asi, alguien me lo explicaría mejor...

Gracias....
  #11 (permalink)  
Antiguo 14/07/2008, 11:53
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: POST se ejecuta al actualizar, ¿como lo evito?

Así es, si haces algo así te ocurre el problema, la única forma de que lo hagas es que quites esa parte de HTML y el include lo hagas al inicio de tu index.php

Saludos.
  #12 (permalink)  
Antiguo 14/07/2008, 11:56
Avatar de [NiRVaNa]  
Fecha de Ingreso: abril-2004
Ubicación: Someplace In The Middle Of Nowhere!
Mensajes: 325
Antigüedad: 20 años
Puntos: 6
Respuesta: POST se ejecuta al actualizar, ¿como lo evito?

Ok... entonces, no hay alguna otra funcion que haga una redirect en php?

Salu2...
  #13 (permalink)  
Antiguo 14/07/2008, 12:02
Avatar de jaronu  
Fecha de Ingreso: febrero-2008
Mensajes: 2.183
Antigüedad: 16 años, 1 mes
Puntos: 52
Respuesta: POST se ejecuta al actualizar, ¿como lo evito?

Hola

podrias usar java script, para redirigir en vez de header, es una forma de no tener problemas con el HTML Y header ()

Cita:
?>

<SCRIPT LANGUAGE="javascript">
location.href = "principal2.php";

</SCRIPT>

<?
  #14 (permalink)  
Antiguo 14/07/2008, 12:42
Avatar de [NiRVaNa]  
Fecha de Ingreso: abril-2004
Ubicación: Someplace In The Middle Of Nowhere!
Mensajes: 325
Antigüedad: 20 años
Puntos: 6
Respuesta: POST se ejecuta al actualizar, ¿como lo evito?

Ajam... Pero era justamente eso lo que queria evitar...

Bueno, muchas gracias por los consejos... Creo que optaré por reacomodar mi codificacion y hacerla mas eficiente...

Salu2...
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 04:16.