<?php // ========================================================================= // 1. CONFIGURACIÓN PRINCIPAL (EDITA ESTOS DATOS) // ========================================================================= $db_host = 'localhost'; $db_name = 'tu_base_de_datos';$db_user = 'tu_usuario_mysql'; $db_pass = 'tu_contrasena_mysql';$clave_admin = '1234'; // Clave para que el cumpleañero vea los confirmados // Datos del Evento $evento = [ 'nombre' => 'Camilo Andrés', 'fecha_texto' => 'Sábado, 28 de Noviembre • 7:00 PM', 'fecha_iso' => '2026-11-28T19:00:00', // Formato YYYY-MM-DDTHH:MM:SS 'ics_inicio' => '20261128T190000', 'ics_fin' => '20261129T010000', 'lugar' => 'Salón Terraza Mirador — Cra. 15 # 93-40, Bogotá', 'lat' => '4.6768', 'lng' => '-74.0483', 'limite_rsvp' => '22 de noviembre', 'cuentas' => [ ['banco' => 'Nequi / Llave Bre-B', 'numero' => '3104567890'], ['banco' => 'Daviplata', 'numero' => '3104567890'], ['banco' => 'Bancolombia Ahorros','numero' => '12345678901'] ] ]; // ========================================================================= // 2. CONEXIÓN Y AUTOINSTALACIÓN DE TABLAS MYSQL // ========================================================================= try { $pdo = new PDO("mysql:host=$db_host;dbname=$db_name;charset=utf8mb4", $db_user,$db_pass, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ]); // Crear tablas automáticamente si no existen $pdo->exec("CREATE TABLE IF NOT EXISTS rsvp_cumple ( id INT AUTO_INCREMENT PRIMARY KEY, nombre VARCHAR(120) NOT NULL, asiste ENUM('si', 'no') NOT NULL, cupos INT DEFAULT 1, mensaje VARCHAR(255) DEFAULT '', fecha_registro TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"); $pdo->exec("CREATE TABLE IF NOT EXISTS regalos_cumple ( id INT AUTO_INCREMENT PRIMARY KEY, titulo VARCHAR(150) NOT NULL, detalle VARCHAR(150) DEFAULT '', estado ENUM('disponible', 'apartado') DEFAULT 'disponible', apartado_por VARCHAR(120) DEFAULT NULL, fecha_apartado TIMESTAMP NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"); // Insertar regalos iniciales solo si la tabla está vacía $count =$pdo->query("SELECT COUNT(*) FROM regalos_cumple")->fetchColumn(); if ($count == 0) {$pdo->exec("INSERT INTO regalos_cumple (titulo, detalle) VALUES ('Perfume Invictus Victory', 'Frasco 100 ml'), ('Tenis casuales blancos', 'Talla 41'), ('Bono de regalo Zara / Falabella', 'Cualquier valor'), ('Audífonos inalámbricos', 'Color negro')"); } } catch (PDOException $e) { if (isset($_REQUEST['action'])) { header('Content-Type: application/json; charset=utf-8'); echo json_encode(['ok' => false, 'error' => 'Error de conexión a la base de datos']); exit; } die("
Error de conexión MySQL: Verifica tus credenciales en las líneas 5-8 de este archivo.
"); } // ========================================================================= // 3. ENDPOINTS API EN TIEMPO REAL (AJAX) // ========================================================================= if (isset($_REQUEST['action'])) { header('Content-Type: application/json; charset=utf-8'); $action =$_REQUEST['action']; // Obtener regalos if ($action === 'get_regalos') { $stmt =$pdo->query("SELECT id, titulo, detalle, estado FROM regalos_cumple ORDER BY id ASC"); echo json_encode(['ok' => true, 'regalos' => $stmt->fetchAll()]); exit; } // Apartar regalo if ($action === 'apartar_regalo' &&$_SERVER['REQUEST_METHOD'] === 'POST') { $id = intval($_POST['id'] ?? 0); $nombre = trim($_POST['nombre'] ?? 'Invitado'); if ($id <= 0) { echo json_encode(['ok' => false, 'error' => 'Regalo inválido']); exit; } $stmt =$pdo->prepare("UPDATE regalos_cumple SET estado = 'apartado', apartado_por = ?, fecha_apartado = NOW() WHERE id = ? AND estado = 'disponible'"); $stmt->execute([$nombre,$id]); if ($stmt->rowCount() > 0) { echo json_encode(['ok' => true]); } else { echo json_encode(['ok' => false, 'error' => 'Este regalo ya fue elegido por otro invitado.']); } exit; } // Guardar confirmación RSVP if ($action === 'guardar_rsvp' && $_SERVER['REQUEST_METHOD'] === 'POST') {$nombre = trim($_POST['nombre'] ?? '');$asiste = ($_POST['asiste'] ?? 'si') === 'no' ? 'no' : 'si';$cupos = $asiste === 'si' ? max(1, min(10, intval($_POST['cupos'] ?? 1))) : 0; $mensaje = trim($_POST['mensaje'] ?? ''); if ($nombre === '') { echo json_encode(['ok' => false, 'error' => 'Por favor escribe tu nombre.']); exit; } $stmt =$pdo->prepare("INSERT INTO rsvp_cumple (nombre, asiste, cupos, mensaje) VALUES (?, ?, ?, ?)"); $stmt->execute([$nombre,$asiste, $cupos,$mensaje]); echo json_encode(['ok' => true]); exit; } // Reporte privado del anfitrión if ($action === 'admin_report' &&$_SERVER['REQUEST_METHOD'] === 'POST') { $clave =$_POST['clave'] ?? ''; if ($clave !==$clave_admin) { echo json_encode(['ok' => false, 'error' => 'Clave incorrecta']); exit; } $invitados =$pdo->query("SELECT nombre, asiste, cupos, mensaje, fecha_registro FROM rsvp_cumple ORDER BY id DESC")->fetchAll(); $regalos =$pdo->query("SELECT titulo, detalle, estado, apartado_por FROM regalos_cumple ORDER BY id ASC")->fetchAll(); $total_cupos = 0; foreach ($invitados as$inv) { if ($inv['asiste'] === 'si') $total_cupos += intval($inv['cupos']); } echo json_encode([ 'ok' => true, 'total_cupos' => $total_cupos, 'invitados' => $invitados, 'regalos' => $regalos ]); exit; } echo json_encode(['ok' => false, 'error' => 'Acción no válida']); exit; } ?>
Cumpleaños de <?= htmlspecialchars($evento['nombre']) ?>