CARRITO SESSION GUARDAR CHAT GPT JS PHP MYSQL OTRO CASO
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Carrito de compras</title>
</head>
<body>
<h1>Productos disponibles</h1>
<ul id="productos"></ul>
<script src="productos.js"></script>
</body>
</html>
/////////////////////////////////////////
const productos = document.getElementById('productos');
function obtenerProductos() {
fetch('obtenerProductos.php')
.then(response => response.json())
.then(data => {
data.forEach(producto => {
const li = document.createElement('li');
li.innerHTML = `${producto.nombre} - $${producto.precio}
<button onclick="agregarProducto(${producto.id})">Agregar al
carrito</button>`;
productos.appendChild(li);
});
});
}
obtenerProductos();
/////////////////////////////////////////
<?php
require_once 'conexion.php';
$statement = $conexion->prepare('SELECT * FROM productos');
$statement->execute();
$productos = $statement->fetchAll(PDO::FETCH_ASSOC);
header('Content-Type: application/json');
echo json_encode($productos);
//////////////////////////////////////////////////////
let carrito = [];
function agregarProducto(id) {
fetch(`agregarProducto.php?id=${id}`)
.then(response => response.json())
.then(data => {
carrito = data;
mostrarCarrito(carrito);
});
}
function actualizarCantidad(id, cantidad) {
fetch(`actualizarCantidad.php?id=${id}&cantidad=${cantidad}`)
.then(response => response.json())
.then(data => {
carrito = data;
mostrarCarrito(carrito);
});
}
function eliminarProducto(id) {
fetch(`eliminarProducto.php?id=${id}`)
.then(response => response.json())
.then(data => {
carrito = data;
mostrarCarrito(carrito);
});
}
function vaciarCarrito() {
fetch('vaciarCarrito.php')
.then(response => response.json())
.then(data => {
carrito = data;
mostrarCarrito(carrito);
});
}
function mostrarCarrito(carrito) {
const carritoElement = document.getElementById('carrito');
carritoElement.innerHTML = '';
carrito.forEach(producto => {
const row = document.createElement('tr');
const item = document.createElement('td');
item.innerHTML = `${producto.nombre} x <input type="number"
value="${producto.cantidad}" min="1" max="100"
onchange="actualizarCantidad(${producto.id}, this.value)" /> =
$${producto.precio * producto.cantidad}`;
row.appendChild(item);
const botonEliminar = document.createElement('button');
botonEliminar.innerHTML = 'Eliminar';
botonEliminar.onclick = () => eliminarProducto(producto.id);
row.appendChild(botonEliminar);
carritoElement.appendChild(row);
});
}
////////////////////////////////////////////////////////////////
carrito.php
<?php
session_start();
require_once 'config.php';
if (isset($_POST['id']) && isset($_POST['action'])) {
$id = $_POST['id'];
switch ($_POST['action']) {
case 'add':
agregarProducto($id);
break;
case 'update':
actualizarCantidad($id, $_POST['cantidad']);
break;
case 'remove':
eliminarProducto($id);
break;
case 'vaciar':
vaciarCarrito();
break;
}
}
function agregarProducto($id) {
global $pdo;
$stmt = $pdo->prepare("SELECT * FROM productos WHERE id = ?");
$stmt->execute([$id]);
$producto = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$producto) {
die("El producto seleccionado no existe.");
}
if (isset($_SESSION['carrito'][$id])) {
$_SESSION['carrito'][$id]['cantidad']++;
} else {
$_SESSION['carrito'][$id] = [
'id' => $id,
'nombre' => $producto['nombre'],
'precio' => $producto['precio'],
'cantidad' => 1
];
}
header('Content-Type: application/json');
echo json_encode($_SESSION['carrito']);
}
function actualizarCantidad($id, $cantidad) {
if (isset($_SESSION['carrito'][$id])) {
$_SESSION['carrito'][$id]['cantidad'] = $cantidad;
}
header('Content-Type: application/json');
echo json_encode($_SESSION['carrito']);
}
function eliminarProducto($id) {
if (isset($_SESSION['carrito'][$id])) {
unset($_SESSION['carrito'][$id]);
}
header('Content-Type: application/json');
echo json_encode($_SESSION['carrito']);
}
function vaciarCarrito() {
unset($_SESSION['carrito']);
header('Content-Type: application/json');
echo json_encode($_SESSION['carrito']);
}
function mostrarCarrito() {
$total = 0;
if (isset($_SESSION['carrito'])) {
echo '<table>';
echo '<thead>';
echo '<tr>';
echo '<th>Producto</th>';
echo '<th>Precio</th>';
echo '<th>Cantidad</th>';
echo '<th>Total</th>';
echo '<th>Eliminar</th>';
echo '</tr>';
echo '</thead>';
echo '<tbody>';
foreach ($_SESSION['carrito'] as $producto) {
$subtotal = $producto['precio'] * $producto['cantidad'];
$total += $subtotal;
echo '<tr>';
echo '<td>' . $producto['nombre'] . '</td>';
echo '<td>$' . number_format($producto['precio'], 2) . '</td>';
echo '<td><input type="number" min="1" max="100" value="' .
$producto['cantidad'] . '" onchange="actualizarCantidad(' .
$producto['id'] . ', this.value)"></td>';
echo '<td>$' . number_format($subtotal, 2) . '</td>';
echo '<td><button onclick="eliminarProducto(' . $producto['id'] .
')">Eliminar</button></td>';
echo '</tr>';
}
echo '</tbody>';
echo '<tfoot>';
echo '<tr>';
echo '<td colspan="3">Total:</td>';
echo '<td>$' . number_format($total, 2) . '</td>';
echo '<td></td>';
echo '</tr>';
echo '</tfoot>';
echo '</table>';
} else {
echo '<p>No hay productos en el carrito</p>';
}
}
/////////////////////////////////////////
agregarProducto.php
<?php
// Verificar que se haya enviado un ID de producto
if (!isset($_POST['id'])) {
echo json_encode(array('ok' => false, 'mensaje' => 'No se ha
especificado un ID de producto.'));
exit();
}
$id = $_POST['id'];
// Obtener el producto de la base de datos
// Aquí deberías reemplazar las credenciales y el nombre de la base de
datos con los tuyos
$dsn = 'mysql:host=localhost;dbname=nombre_de_la_base_de_datos';
$usuario = 'nombre_de_usuario';
$contraseña = 'contraseña';
try {
$conexion = new PDO($dsn, $usuario, $contraseña);
$consulta = $conexion->prepare('SELECT * FROM productos WHERE id = :id');
$consulta->bindParam(':id', $id);
$consulta->execute();
$producto = $consulta->fetch(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
echo json_encode(array('ok' => false, 'mensaje' => 'Error al
conectar con la base de datos.'));
exit();
}
// Verificar que se haya encontrado el producto en la base de datos
if (!$producto) {
echo json_encode(array('ok' => false, 'mensaje' => 'No se ha
encontrado el producto especificado.'));
exit();
}
// Verificar que haya suficiente stock para el producto
if ($producto['stock'] <= 0) {
echo json_encode(array('ok' => false, 'mensaje' => 'No hay
suficiente stock para este producto.'));
exit();
}
// Obtener el carrito actual del usuario
session_start();
if (!isset($_SESSION['carrito'])) {
$_SESSION['carrito'] = array();
}
$carrito = $_SESSION['carrito'];
// Verificar si el producto ya está en el carrito
$indice = array_search($id, array_column($carrito, 'id'));
if ($indice !== false) {
// Si el producto ya está en el carrito, aumentar su cantidad en 1
$carrito[$indice]['cantidad'] += 1;
} else {
// Si el producto no está en el carrito, agregarlo con cantidad 1
$producto_carrito = array(
'id' => $id,
'nombre' => $producto['nombre'],
'precio' => $producto['precio'],
'cantidad' => 1,
);
array_push($carrito, $producto_carrito);
}
// Actualizar el stock del producto en la base de datos
$stock_actualizado = $producto['stock'] - 1;
try {
$consulta = $conexion->prepare('UPDATE productos SET stock = :stock
WHERE id = :id');
$consulta->bindParam(':stock', $stock_actualizado);
$consulta->bindParam(':id', $id);
$consulta->execute();
} catch (PDOException $e) {
echo json_encode(array('ok' => false, 'mensaje' => 'Error al
actualizar el stock del producto.'));
exit();
}
// Guardar el carrito actualizado en la sesión
$_SESSION['carrito'] = $carrito;
// Responder con el carrito actualizado
echo json_encode(array('ok' => true, 'carrito' => $carrito));
?>
////////////////////////////////////////////
actualizarCantidad.php
<?php
session_start();
if(isset($_SESSION['carrito']) && !empty($_GET['id']) &&
!empty($_GET['cantidad'])) {
$id = $_GET['id'];
$cantidad = $_GET['cantidad'];
// Conexión a la base de datos
$dsn = "mysql:host=localhost;dbname=nombre_de_la_base_de_datos;charset=utf8mb4";
$usuario = "nombre_del_usuario";
$contraseña = "contraseña_del_usuario";
try {
$conexion = new PDO($dsn, $usuario, $contraseña);
$conexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
// Consulta para obtener el producto
$consulta = "SELECT * FROM productos WHERE id = :id";
$statement = $conexion->prepare($consulta);
$statement->execute(array(':id' => $id));
$producto = $statement->fetch(PDO::FETCH_ASSOC);
// Si el producto existe
if ($producto) {
$carrito = $_SESSION['carrito'];
// Actualizar la cantidad
foreach ($carrito as $key => $producto_carrito) {
if ($producto_carrito['id'] == $id) {
$carrito[$key]['cantidad'] = $cantidad;
}
}
// Actualizar el carrito en la sesión
$_SESSION['carrito'] = $carrito;
// Devolver el carrito actualizado
header('Content-Type: application/json');
echo json_encode($_SESSION['carrito']);
}
}
/////////////////////////////////////////////
eliminarProducto.php
<?php
session_start();
if (isset($_GET['id'])) {
$id = $_GET['id'];
if (isset($_SESSION['carrito'][$id])) {
unset($_SESSION['carrito'][$id]);
}
}
header('Location: carrito.php');
exit();
?>
/////////////////////////////////////
vaciarCarrito.php
<?php
session_start();
unset($_SESSION['carrito']);
header('Location: carrito.php');
exit();
?>
//////////////////////////////
guardarCarrito.php
<?php
$servername = "localhost";
$username = "tu_usuario";
$password = "tu_contraseña";
$dbname = "tu_base_de_datos";
// Crear conexión
$conn = new mysqli($servername, $username, $password, $dbname);
// Comprobar conexión
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// Recibir datos del carrito
$carrito = json_decode($_POST['carrito']);
// Recorrer el carrito y guardar los productos en la tabla
foreach ($carrito as $producto) {
$nombre = $producto->nombre;
$cantidad = $producto->cantidad;
$precio = $producto->precio;
$sql = "INSERT INTO carrito (nombre, cantidad, precio) VALUES
('$nombre', $cantidad, $precio)";
if ($conn->query($sql) === TRUE) {
echo "Producto guardado correctamente";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
}
$conn->close();
?>
//////////////////
function guardarCarrito() {
const carrito = JSON.stringify(Object.values(localStorage));
fetch('guardarCarrito.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: carrito
})
.then(response => {
if (!response.ok) {
throw new Error('Error al guardar el carrito');
}
localStorage.clear();
alert('Carrito guardado exitosamente');
})
.catch(error => {
console.error(error);
alert('Error al guardar el carrito');
});
}
//////////////////////esteeeeeeeeeeeeeeeeeeeeeeeee
function guardarCarrito() {
fetch('guardarCarrito.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ carrito: $_SESSION["carrito"] })
})
.then(response => {
if (!response.ok) {
throw new Error('Error al guardar el carrito');
}
return response.json();
})
.then(data => {
console.log('Carrito guardado exitosamente:', data);
})
.catch(error => {
console.error('Error al guardar el carrito:', error);
});
}
En el archivo PHP guardarCarrito.php, puedes obtener el objeto JSON
enviado por la solicitud POST y luego convertirlo de nuevo en un
objeto PHP utilizando la función json_decode(). Aquí te muestro un
ejemplo:
php
Copy code
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$json = file_get_contents('php://input');
$data = json_decode($json, true);
$_SESSION['carrito'] = $data['carrito'];
echo json_encode(['message' => 'Carrito guardado exitosamente']);
} else {
echo json_encode(['error' => 'Solicitud no válida']);
}
?>
///////////////////
<?php
// Iniciar sesión
session_start();
// Verificar si el carrito existe
if (isset($_SESSION['carrito'])) {
// Obtener los detalles de la conexión a la base de datos
$host = 'localhost';
$dbname = 'nombre_de_la_base_de_datos';
$username = 'nombre_de_usuario';
$password = 'contraseña';
// Conectar a la base de datos usando PDO
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
// Preparar la consulta para insertar los productos del carrito en la tabla
$stmt = $pdo->prepare("INSERT INTO carrito (nombre, precio,
cantidad) VALUES (:nombre, :precio, :cantidad)");
// Recorrer los productos del carrito
foreach ($_SESSION['carrito'] as $producto) {
// Asignar los valores de los productos a los parámetros de la consulta
$stmt->bindParam(':nombre', $producto['nombre']);
$stmt->bindParam(':precio', $producto['precio']);
$stmt->bindParam(':cantidad', $producto['cantidad']);
// Ejecutar la consulta
$stmt->execute();
}
// Cerrar la conexión a la base de datos
$pdo = null;
// Vaciar el carrito
unset($_SESSION['carrito']);
// Redirigir al usuario a la página de confirmación de compra
header('Location: confirmacion.php');
exit;
} else {
// Si el carrito no existe, redirigir al usuario a la página de inicio
header('Location: index.php');
exit;
}
?>
Comentarios
Publicar un comentario