Este es uno de los problemas mas comunes cuando estamos peleando con el desarrollo de nuestra tienda online. El usuario llega al producto, le da al botón de comprar, quiere seguir comprando y le da al botón atrás, en ese momento, nuestro script de añadir al carrito rehace la petición y añade el producto de nuevo al carrito. ¡Socorro!. Si bien queremos que compre todo lo que pueda, no podemos dejar este funcionamiento así.
Hay muchas técnicas para evitar esto, habréis escuchado el tema de la caché, de hacer un request para ver de qué página viene, etc… pero todas son engorrosas y no del todo fiables pues dependemos de la configuración de caché tanto del cliente como del servidor donde se aloja nuestra tienda. Por eso os traigo la que creo que es la mejor solución, utilizar variables de sesión. Este ejemplo es perfectamente utilizable en el .
Suponiendo que tengamos 3 páginas para tramitar el concepto de «Añadir al carrito»:
- A) Página donde veo el producto y tengo el botón de Comprar o añadir al carrito
- B) Página intermedia que añade el producto a la base de datos (esta página tiene header y no se llega a ver en la navegación)
- C) Página del carrito donde se muestra la lista de productos que ya ha metido previamente.
Teniendo esto, en la página A) inicializaremos una variable de sesión al valor «1», este código lo pondremos justo arriba de la página, habitualmente después del include de conexiones y dentro de código PHP:
$_SESSION[«estado»]=1;
En la página B) pondremos un código de forma que si esa variable de sesión es igual a «1», se producirá el añadido al carrito, en caso de que sea «0», usaremos un header para redireccionarlo a la página C) o a cualquier otra que deseemos:
if ($_SESSION[«estado»]==0){
header(«Location:carrito_lista.php»);
exit();
} else {
//CÓDIGO DE INSERT O UPDATE DE UN PRODUCTO AL CARRITO
}
Por último, en la página C) y en la misma ubicación que antes hemos hecho en la página A), ponemos el valor de la variable de sesión a «0»:
$_SESSION[‘estado’]=0;
De esta forma y con estos tres sencillos pasos, aunque la persona le de al botón de atrás del navegador, no se introducirá otro producto y nos volverá a la página del carrito_lista.php
Espero que os haya sido útil, cualquier comentario es bienvenido.
El año pasado ya resolvi este problema, pero tengo otro problema de este estilo en las páginas de carrito forma pago, y carrito finalización. Cuando hago clic en siguiente en carrito forma pago me lleva a carrito finalización, y si vuelvo atrás (en este punto aprovecho para consultar el listado de mis-compras.php, y el producto se ha añadido a la lista con el estado de pendiente de confirmar el pago) regreso a la página de carrito-forma-pago.php, y el problema viene si vuelvo a seleccionar forma de pago y le doy a siguiente, me sale el famoso error (You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘WHERE idProducto=’ at line 1). ¿Esto se puede resolver con esto que explicas aquí? Me ocurre en mi web: http://www.buceoh2o.com
Claro, lo puedes resolver con lo que se explica en este post!
Saludos
No se donde debo colocar exactamente el código en la pagina B) o más bien que debe contener exactamente el //CÓDIGO DE INSERT O UPDATE DE UN PRODUCTO AL CARRITO y que debo dejar fuera.
Básicamente en esa parte del código van las instrucciones (consultas SQL) que agregan y/o actualizan el articulo al carrito de compras. Si ya en tu código tenías estas instrucciones, por ejemplo algo de tipo: «Insert into carrito values (…», lo unico que debes hacer es encerrar ese código en el ‘If’ que valida la variable de sesión, el cual si verifica que está en 0, se va a la lista del carrito, sino está en 0 (es decir, si está en 1), ejecuta el código SQL que ya te mencioné.
Espero que me hayas entendido.
Saludos!
¿Pero si lo que realmente quiero hacer es volver a la página de compras (la pagina ‘A’)?
Porque cuando le de clic al botón Atras, siempre me va a llevar a la página del carrito ¿no es cierto?
Lo podrías hacer si guardas en otra variable de sesión el id o la URL de la página A). De forma que al hacer el header en la B), salte a la dirección que contiene esa otra variable de sesión.
A mi no me gusta porque para mi no tiene sentido volver al producto que acabo de comprar, creo que el asunto es que en el carrito, haya un botón para «seguir comprando» y lo lleves donde consideres que puede seguir comprando en base al tipo de producto que acabe de comprar o bien los que lleva ya en el carrito, o bien a la página inicial de compras. Saludos
OK. Gracias. Saludos!
Gracias Jorge! Justo lo que necesitaba resolver!!
Genial, me alegro!. Saludos