libreria.php
<?php function conectar() { $server = "localhost"; $user = "root"; $password = ""; $db = "trivial"; try { $conn = new PDO("mysql:host=$server;dbname=$db", $user, $password, [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"]); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); return $conn; } catch (Exception $ex) { echo $ex->getMessage(); } } function getPregunta($idUsuario) { try { $conn = conectar(); //Buscamos una pregunta que no se haya hecho a este usuario al azar $sql = "SELECT * FROM preguntas where idpreguntas not in (select idpreguntas from resultados where idusuarios=$idUsuario) order by rand() limit 1"; $resul = $conn->query($sql); $fila = $resul->fetch(); return $fila; } catch (Exception $ex) { echo $ex->getMessage(); } } function getPuntuacion($idUsuario) { try { $conn = conectar(); $sql = "SELECT ifnull(sum(puntos),0) puntuacion FROM resultados where idusuarios=:id"; $st = $conn->prepare($sql); $st->execute(['id' => $idUsuario]); $fila = $st->fetch(); return $fila['puntuacion']; } catch (Exception $ex) { echo $ex->getMessage(); } } function comprobarUsuario($nombre, $password) { try { $conn = conectar(); //Buscamos un usuario con el nombre solicitado $sql = "select * from usuarios where nombre=:nombre"; $st = $conn->prepare($sql); $st->execute(['nombre' => $nombre]); $usuario = $st->fetch(); //Si no existe es un alta, lo insertamos en la BD if (!$usuario) { $st = $conn->prepare("insert into usuarios (nombre,password) values (:nombre,:password)"); $st->execute(['nombre' => $nombre, 'password' => md5($password)]); //Y devolvemos el id del usuario insertado return $conn->lastInsertId(); } else { //Si el usuario existe miramos si la contrasela coincide, si es así devolvemos el id if (md5($password) == $usuario['password']) { return $usuario['idusuarios']; } } //Si no se da ninguna de las condiciones devolvemos falso return false; } catch (Exception $ex) { echo $ex->getMessage(); return false; } } function guardaResultado($idUsuario, $idPregunta, $puntos) { try { $conn = conectar(); $sql = "insert into resultados (idusuarios,idpreguntas,puntos) values (:idu,:idp,:puntos)"; $st = $conn->prepare($sql); $st->execute(['idu' => $idUsuario, 'idp' => $idPregunta, 'puntos' => $puntos]); return getPuntuacion($idUsuario); } catch (Exception $ex) { echo $ex->getMessage(); } }
login.php
<?php require_once 'libreria.php'; $error=""; session_start(); //Recuperamos el valor de nombre y password $nombre= filter_input(INPUT_POST, 'nombre'); $password= filter_input(INPUT_POST, 'password'); //Si no están vacíos es porque hay un registro o login, lo comprobamos en la BD if (!empty($nombre) && !empty($password)){ //La función comprobar Usuario nos devuelve el id del usuario si existe $idUsuario=comprobarUsuario($nombre,$password); //Si existe el usuario guardamos la información en la BD y redirigimos al index if ($idUsuario){ $_SESSION['idUsuario']=$idUsuario; $_SESSION['nombre']=$nombre; header("location:index.php"); } else{ $error="Usuario o contraseña incorrecta"; } } ?> <!DOCTYPE html> <html> <head> <title>Trivial informático</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script> </head> <body> <div class="container" > <div class="jumbotron"> <h1>Introduce tu usuario y contraseña</h1> <h2>Si no estás en el sistema se creará tu usuario</h2> <h2 class="text-danger"><?=$error?></h2> </div> <form method="post"> <div class="form-group"> <label for="nombre">Usuario:</label> <input type="text" class="form-control" name="nombre"> </div> <div class="form-group"> <label for="pwd">Password:</label> <input type="password" class="form-control" name="password"> </div> <button type="submit" class="btn btn-primary">Enviar</button> </form> </div> </body> </html>
index.php
<?php session_start(); //Si no está definida la variable de sesión es que no se ha logueado, lo mandamos al login if (empty($_SESSION['idUsuario'])){ header("location:login.php"); } require_once("libreria.php"); //Recuperamos la puntuación para mostrarla $puntuacion= getPuntuacion($_SESSION['idUsuario']); ?> <!DOCTYPE html> <html> <head> <title>Trivial informático</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script> </head> <body> <div class="container" > <div class="jumbotron"> <h1 class="display-1">Trivial. Bienvenido <?=$_SESSION['nombre']?></h1> <p>¿Cual es tu cultura general? Puntuación: <span id="puntuacion"><?=$puntuacion?></span></p> </div> <div class="row"> <div class="col-12" id="mensaje" style="min-height: 70px;"></div> </div> <div class="row tablero"> <div class="col-12"><h1 id="pregunta" class="text-center">Bienvenido al trivial. Muy pronto preguntas</h1></div> </div> <div class="row my-4 tablero"> <div class="col-6 text-center"><button id="res1" class="btn btn-lg btn-success">.</button></div> <div class="col-6 text-center"><button id="res2" class="btn btn-lg btn-success">.</button></div> </div> <div class="row tablero"> <div class="col-6 text-center"><button id="res3" class="btn btn-lg btn-success">.</button></div> <div class="col-6 text-center"><button id="res4" class="btn btn-lg btn-success">.</button></div> </div> </div> <script src="trivial.js" type="text/javascript"></script> </body> </html>
trivial.js
var preguntas; //Busca una pregunta por Ajax function cargarPregunta() { $.get("pregunta.php", function (datos, status) { if (status == "success") { preguntas = JSON.parse(datos); pintarPregunta(); } }); } //Pinta la pregunta en nuestro HTML function pintarPregunta() { $('#pregunta').text(preguntas.pregunta); $('#res1').text(preguntas.respuestas[0]); $('#res2').text(preguntas.respuestas[1]); $('#res3').text(preguntas.respuestas[2]); $('#res4').text(preguntas.respuestas[3]); $(".tablero").show(); $('#mensaje div').fadeOut(); } $(function () { cargarPregunta(); //Enlazar con los botones el evento click y comprobar si la respuesta es correcta $('button').click(function () { var puntos = 0; //Comprobamos que el botón pulsado es la respuesta correcta if ($(this).text() === preguntas.correcta) { $('#mensaje').html('<div class="alert alert-success alert-dismissible"> <button type="button" class="close" data-dismiss="alert">×</button> <strong>¡Bien! </strong> Respuesta correcta.</div>') puntos = 1; } else { $('#mensaje').html('<div class="alert alert-danger alert-dismissible"> <button type="button" class="close" data-dismiss="alert">×</button> <strong>¡Error! </strong> Respuesta incorrecta.</div>') } //Escondemos el tablero para queno pueda pulsar más botones $(".tablero").hide(); //LLamamos por ajax con post para guardar los resultados, la función nos devuelve la puntuación $.post("resultado.php", {idPregunta: preguntas.id, puntos: puntos}, function (datos, status) { $('#puntuacion').text(datos); cargarPregunta(); }); }); });
pregunta.php
<?php require_once 'libreria.php'; session_start(); //Obtenemos una pregunta de la base de datos $fila = getPregunta($_SESSION['idUsuario']); //La fila que recuperamos la organizamos de una manera más amigable para el JS $res['pregunta'] = $fila['pregunta']; $res['id'] = $fila['idpreguntas']; $res['correcta'] = $fila['respuesta1']; $res['respuestas'] = [$fila['respuesta1'], $fila['respuesta2'], $fila['respuesta3'], $fila['respuesta4']]; shuffle($res['respuestas']); //Lo codificamos en JSON echo json_encode($res);
resultado.php
<?php require_once 'libreria.php'; session_start(); //Recuperamos los datos $idUsuario= $_SESSION['idUsuario']; $idPregunta= filter_input(INPUT_POST, 'idPregunta'); $puntos= filter_input(INPUT_POST, 'puntos'); //Y guardamos el resultado $puntos=guardaResultado($idUsuario,$idPregunta,$puntos); //Devolvemos los puntos echo $puntos;