connect_error) { die(json_encode(["error" => "Conexión fallida: " . $conn->connect_error])); } // Obtener la IP del cliente en el servidor $ip_address = $_SERVER['REMOTE_ADDR']; // Recibir los datos enviados desde el frontend $data = json_decode(file_get_contents("php://input"), true); $user_agent = $data['user_agent'] ?? null; $nombre_usuario = $data['nombre_usuario'] ?? null; // Consultar la cantidad de giros disponibles en la tabla limite_giros $sqlLimite = "SELECT cantidad FROM girospermitidos WHERE id = 1"; // Se asume un único registro de control $resultLimite = $conn->query($sqlLimite); if ($resultLimite->num_rows > 0) { $rowLimite = $resultLimite->fetch_assoc(); $cantidadGirosDisponibles = $rowLimite['cantidad']; if ($cantidadGirosDisponibles <= 0) { echo json_encode(["error" => "Se ha alcanzado el límite de giros"]); $conn->close(); exit(); } // Restar un giro al contador global $stmtGiros = $conn->prepare("UPDATE girospermitidos SET cantidad = cantidad - 1 WHERE id = 1"); if ($stmtGiros) { $stmtGiros->execute(); $stmtGiros->close(); } else { echo json_encode(["error" => "Error al actualizar el límite de giros"]); $conn->close(); exit(); } } else { echo json_encode(["error" => "No se encontró el registro de límite de giros"]); $conn->close(); exit(); } // Consultar los premios con cantidad mayor que 0 $sql = "SELECT id, nombre, probabilidad, cantidad, inicio, final FROM premiosnew WHERE cantidad > 0 AND nombre_usuario = '$nombre_usuario'"; $result = $conn->query($sql); $premios = array(); $totalProbabilidad = 0; if ($result->num_rows > 0) { // Calcular el total de probabilidades while ($row = $result->fetch_assoc()) { $premios[] = $row; $totalProbabilidad += $row['probabilidad']; } // Generar un número aleatorio entre 0 y el total de probabilidades $random = mt_rand(0, $totalProbabilidad * 1000) / 1000; // Se multiplica por 1000 para trabajar con 3 decimales $suma = 0; // Seleccionar el premio basado en la probabilidad acumulada foreach ($premios as $premio) { $suma += $premio['probabilidad']; if ($random <= $suma) { // Actualizar la cantidad del premio seleccionado $stmt = $conn->prepare("UPDATE premiosnew SET cantidad = cantidad - 1 WHERE id = ?"); if ($stmt) { $stmt->bind_param("i", $premio['id']); $stmt->execute(); $stmt->close(); // Agregar el premio y nombre a la tabla premios $stmtInsert = $conn->prepare( "INSERT INTO premiosentregados (nombre_usuario, premio, ip_address, user_agent) VALUES (?, ?, ?, ?)" ); if ($stmtInsert) { $stmtInsert->bind_param( "ssss", $nombre_usuario, $premio['nombre'], $ip_address, $user_agent ); $stmtInsert->execute(); $stmtInsert->close(); } else { echo json_encode(["error" => "Error al guardar el participante"]); exit(); } // Devolver el premio seleccionado con sus rangos de ángulo echo json_encode([ 'id' => $premio['id'], 'nombre' => $premio['nombre'], 'inicio' => $premio['inicio'], 'final' => $premio['final'] ]); exit(); // Salir inmediatamente después de devolver el premio seleccionado } else { echo json_encode(["error" => "Error en la preparación de la actualización"]); } break; } } } else { echo json_encode(["error" => "No hay premios disponibles"]); } $conn->close(); ?>