Evitar doble POST en PHP
Este mini tutorial puede ser usado como referencia para cualquier lenguaje de programación, tratare de explicar el código para que pueda ser pasado a otros lenguajes como ASP o JSP.
Muchas veces se nos presenta este caso, tenemos un formulario cuyas variables son enviadas al servidor por POST, luego se ejecuta alguna función para su proceso ya sea enviar un email, escribir en un archivo o modificar las tablas de una base de datos, aquí se presenta un problema, el usuario puede recargar la pagina ya sea con F5 o con la opción recargar enviando erróneamente el formulario por segunda vez, para evitar esto la respuesta al submit puede ser puesta en una nueva pagina, pero en mi caso necesitaba trabajar sobre el mismo php.
Encontre una clase que soluciona este problema la cual verifica si un formulario es enviado mas de una vez.
Creamos una clase postClass.php
-
<?php
-
class Post_Block {
-
function startPost() {
-
echo “<input type=’hidden’ name=’postID’ “;
-
}
-
function postBlock($postID) {
-
if ($postID == $_SESSION['postID']) {
-
return false;
-
} else {
-
$_SESSION['postID'] = $postID;
-
return true;
-
}
-
} else {
-
$_SESSION['postID'] = $postID;
-
return true;
-
}
-
}
-
;}
-
?>
-
<?php
-
require(“postClass.php”);
-
$thisPost = new Post_Block;
-
?>
-
<form name=“foo” action=“action.php” method=“post”>
-
<input type=“text” name=“generica” size=“25″>
-
<?php $thisPost->startPost(); ?>
-
</form>
-
<?php
-
require(“postClass.php”);
-
$thisPost = new Post_Block;
-
if ($thisPost->postBlock($_POST['postID'])) {
-
// No existe doble post
-
// Procesamos la información
-
} else {
-
// Doble post, no procesamos el form.
-
echo “Oops!! Doble Post!”;
-
}
-
?>
-
<?php
-
?>
-
<form name=“foo” method=“post”>
-
<input type=“text” name=“generica” size=“25″>
-
<input type=’hidden’ name=’postID’ value=<?php echo “‘”.md5(uniqid(rand(), true)).”‘” ?> >
-
</form>
-
if (postBlock($_POST['postID'])) {
-
// No existe doble post
-
// Procesamos la información
-
} else {
-
// Doble post, no procesamos el form.
-
echo “Oops!! Doble Post!”;
-
}
-
function postBlock($postID) {
-
if ($postID == $_SESSION['postID']) {
-
return false;
-
} else {
-
$_SESSION['postID'] = $postID;
-
return true;
-
}
-
} else {
-
$_SESSION['postID'] = $postID;
-
return true;
-
}
-
}
Leído: 1532 veces

























Febrero 27th, 2009 at 2:42 PM
Otra solucion seria hacerlo por medio de ajax XD..
Saludos
Febrero 27th, 2009 at 7:43 PM
Si de ley, pero en mi caso ajax estaba betado para ese desarrollo
Saludos Tenchi
Junio 5th, 2010 at 4:29 AM
Wish me luck!Great to hear you’re doing so well,Lacie