Desde la Wired
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;
-
}
-
}
| Imprimir artículo | Este artículo fue publicado por Jorge Isaac el 22 enero 2009 a las 11:33 PM, y está archivado en PHP, Programación. Sigue las respuestas a esta entrada a través de RSS 2.0. Puedes dejar un comentario o enviar un trackback desde tu propio sitio. |








hace 2 años
Otra solucion seria hacerlo por medio de ajax XD..
Saludos
hace 2 años
Si de ley, pero en mi caso ajax estaba betado para ese desarrollo
Saludos Tenchi
hace 1 año
Wish me luck!Great to hear you’re doing so well,Lacie
hace 10 meses
Espero sea la solucion a mi problema, ya que no se por que de vez en cuando se realizan hasta mas de 5 registros repetidos con los mismo datos en BD.
gracias y saludos.
hace 8 meses
Compadre muy buena explicación me funciona de mil maravilla !!!!! gracias por el código.
hace 7 meses
Gracias a ti por tu comentario
hace 7 meses
Muy bueno, me salvaste.
Gracias!.
hace 7 meses
Buen código y bien explicado, me ha sido de gran ayuda. Gracias.
hace 6 meses
Voy a probarlo, a mi me pasa que el código Javascript recarga la página que toma los datos del GET y me guarda doble estadística.
hace 4 meses
Mil gracias el codigo funciona muy bien y me ayudaste con este problema!!
hace 4 meses
Me alegra mucho, gracias a ti por la visita
hace 3 meses
La verdad, me ha ayudado mucho.
hace 3 meses
Funciona de maravilla, esta muy bien pensada para la gente como yo que de ajax no tengo ni idea.
Un saludo