feat: Initial commit - Ruleta con PIN (credenciales sanitizadas)
This commit is contained in:
@@ -0,0 +1,128 @@
|
||||
<?php
|
||||
// ─── Configuración de Base de Datos ───
|
||||
// Carga las credenciales desde config.php (no versionado en git).
|
||||
// Si no existe, usa valores por defecto para desarrollo local.
|
||||
if (file_exists(__DIR__ . '/config.php')) {
|
||||
require_once __DIR__ . '/config.php';
|
||||
} else {
|
||||
$servername = "localhost";
|
||||
$username = "root";
|
||||
$password = "";
|
||||
$dbname = "ruleta_db";
|
||||
}
|
||||
|
||||
// Crear la conexión
|
||||
$conn = new mysqli($servername, $username, $password, $dbname);
|
||||
|
||||
// Verificar la conexión
|
||||
if ($conn->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();
|
||||
?>
|
||||
Reference in New Issue
Block a user