Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /**
- * Date: 09.01.2015
- * Time: 22:19
- */
- include("mysql.php");
- /*
- * Übermittelt wird:
- * kuerzel
- */
- /*
- * Ausgeführt werden soll
- * Ist für den User schon eine Frage offen?
- * > Checke die Zeit für diese frage
- * Frage gefunden die keine antwort hat
- * und noch Zeit übrig?
- * ist sie auch teil des Quiz? return !!
- *
- * Frage ohne antwort aber ohne Zeit über?
- * close().frage
- *
- * geb eine Frage aus
- * if Quiz.random = 1 => mixed, sonst linear
- * erstelle für die Frage eine Zeile in der Ergebnistabelle, offen, zeitpuntk der ausgabe
- */
- /*
- * zurückgegeben wird:
- * {
- * frage = "text".
- * antwort = ["antwort", "antwort" ,...]
- *
- * }
- *
- * Bei Authentifikationsproblem => header status code 401
- *
- *
- *
- *
- *
- * Dazu kommt nun die Implementierung der Anmeldezeit bzw die berücksichtigung derer im questionCtrl,
- * anmeldeZeit ist in der timex variable aus der mysql.php/ ToDo: in Config umbennen?
- * Funktion muss nur beim First-Call eingebaut werden,
- * kann auch bei bereits bestehenden offenen fragen vernachlässigt werden
- * Um Zeile 70 rum sollte man mit der SQL Abfrage an die Zeit kommen
- *
- *
- *
- *
- *
- */
- if(checktoken() != true){
- exit("AUTH ERROR 401");
- }
- $clientToken = htmlspecialchars($_COOKIE['XSRF-TOKEN']);
- $clientKuerzel = htmlspecialchars($_COOKIE['KUERZEL']);
- $sql = "SELECT * FROM `qanmeldungen` INNER JOIN qinstanz ON qanmeldungen.`qinstanz-id` = qinstanz.id WHERE qinstanz.`endzeit` >= NOW() AND `users-kuerzel` =:kuerzel AND `deaktiviert` IS NULL";
- $stmt = $db->prepare($sql);
- $stmt->execute(array(
- ":kuerzel" =>$clientKuerzel
- ));
- $row1 = $stmt->fetch();
- // wenn $row inhalt hat, dann ist das Quiz aktiv und fragenkönnen ausgegeben werden
- if( $row1 == false) {
- exit('{"status": "anmeldefehler"}');
- }
- // Geg: Startzeit & tokenX
- // Quiz darf erst starten wenn Startzeit + tokenX < now
- // 2015-01-25 10:17:53
- $past = strtotime( $row1["startzeit"])+$timeXs;
- $now = time();
- if($past >= $now){
- echo '{"status": "quizStillStarting"}';
- exit();
- }
- $random = $row1["random"]; // Ist das Quiz Random?
- $timePerQ = $row1["timePerQ"]; // TimepPerQuestion
- $quizID = $row1["qinstanz-id"]; // User it freigeschaltet für Quiz mit ID (!! muss noch eingebaut werden in die getQuestion, damit niemand von aussen an die Fragen kommt! done)
- function getQuestion($db,$timeX, $random,$timePerQ,$clientKuerzel, $quizID) {
- // return "frage kann ausgegeben werden fuer User".$row['users-kuerzel']."im quiz mit der instanz id: ".$row['id'];
- // check nach offener Frage
- // Selektiere alle Fragen mit :
- // 1. endzeit = 0:00
- // 2. startzeit + $timePerQ > jetzt
- // 3. user id
- // SELECT * FROM `qergebnisse` HAVING TIMEDIFF(`openTime`, '2015-01-13 19:02:01') >2
- // SELECT * FROM `qergebnisse` HAVING TIMEDIFF(`openTime`, '2015-01-13 19:10:01') > 20
- //
- // SELECT * FROM `qergebnisse` WHERE `endTime` IS NULL HAVING TIMEDIFF( '2015-01-13 19:10:01', `openTime`) < '00:11:00.000'
- // SELECT * FROM `qergebnisse` WHERE `endTime` IS NULL HAVING TIMEDIFF( NOW(), `openTime`) < '00:11:00.000'
- // SELECT * FROM `qergebnisse` WHERE `endTime` IS NULL AND `kuerzel`= :kuerzel HAVING TIMEDIFF( NOW(), `openTime`) < '".$timePerQ."'
- //
- //
- //
- //
- //
- $sql = "SELECT *, qergebnisse.id AS 'rowID' FROM `qergebnisse` INNER JOIN fpool ON qergebnisse.fid = fpool.id WHERE `endTime` IS NULL AND `kuerzel`= :kuerzel HAVING TIMEDIFF( NOW(), `openTime`) < '".$timePerQ."'";
- $stmt = $db->prepare($sql);
- $stmt->execute(array(
- ":kuerzel" =>$clientKuerzel
- ));
- $row = $stmt->fetch();
- if( $row != false) {
- /*
- * Es ist noch eine Frage offen :
- */
- return array(
- "frageID" => $row["fid"],
- //"antwortID" => $row["id"],
- "qID" => $row["qid"],
- "rowID" => $row["rowID"],
- "frage" => $row["frage"],
- "antworten"=> array(
- "antwort1" => $row["antwort1"],
- "antwort2" => $row["antwort2"],
- "antwort3" => $row["antwort3"],
- "antwort4" => $row["antwort4"]
- ),
- "level" => $row["level"],
- "openTime" =>countdownRechner($row["openTime"], $timePerQ),
- "marker" => "1"
- );
- }
- /*
- * Es ist noch keine Frage offen, wichtig , auf die order achten, lade neue fragen:
- */
- // Linear:
- if($random == 0) {
- $sql = "select *, f.id AS fragenID
- FROM fpool f
- where f.id not in( select fid as id from qergebnisse WHERE kuerzel =:kuerzel)
- AND f.`qinstanz-id` =:quiz
- ORDER BY f.order ASC limit 1
- ";
- $stmt = $db->prepare($sql);
- $stmt->execute(array(
- ":kuerzel" =>$clientKuerzel,
- ":quiz"=>$quizID
- ));
- $row2 = $stmt->fetch();
- // frage session wird eröffnet
- $sql = "INSERT INTO qergebnisse (kuerzel,qid, fid) VALUES (:kuerzel,:qid,:fid)";
- $q = $db->prepare($sql);
- $q->execute(array(
- ':kuerzel'=> $clientKuerzel,
- ':qid'=> $row2["qinstanz-id"],
- ':fid'=>$row2["fragenID"],
- ));
- if( $row2 == false) {
- exit('{"status":"ende"}');
- }
- return array(
- "frageID" => $row2["id"],
- //!! was ist das nochmal "antwortID" => $row2["id"],
- "qID" => $row2["qinstanz-id"],
- "frage" => $row2["frage"],
- "antworten"=> array(
- "antwort1" => $row2["antwort1"],
- "antwort2" => $row2["antwort2"],
- "antwort3" => $row2["antwort3"],
- "antwort4" => $row2["antwort4"]
- ),
- "level" => $row2["level"],
- "openTime"=> TimetoSec($timePerQ), //"openTime" => countdownRechner($row2["openTime"], $timePerQ), // Open time = timePerQ
- "marker" => "2"
- );
- } else {
- $sql = "select *, f.id AS fragenID
- FROM fpool f
- where f.id not in( select fid as id from qergebnisse WHERE kuerzel =:kuerzel)
- AND f.`qinstanz-id` =:quiz
- ORDER BY RAND() LIMIT 1
- ";
- $stmt = $db->prepare($sql);
- $stmt->execute(array(
- ":kuerzel" =>$clientKuerzel,
- ":quiz" => $quizID
- ));
- $row2 = $stmt->fetch();
- // frage session wird eröffnet
- $sql = "INSERT INTO qergebnisse (kuerzel,qid, fid) VALUES (:kuerzel,:qid,:fid)";
- $q = $db->prepare($sql);
- $q->execute(array(
- ':kuerzel'=> $clientKuerzel,
- ':qid'=> $row2["qinstanz-id"],
- ':fid'=>$row2["fragenID"],
- ));
- if( $row2 == false) {
- exit('{"status":"ende"}');
- }
- return array(
- "frageID" => $row2["id"],
- //!! was ist das nochmal "antwortID" => $row2["id"],
- "qID" => $row2["qinstanz-id"],
- "frage" => $row2["frage"],
- "antworten"=> array(
- "antwort1" => $row2["antwort1"],
- "antwort2" => $row2["antwort2"],
- "antwort3" => $row2["antwort3"],
- "antwort4" => $row2["antwort4"]
- ),
- "level" => $row2["level"],
- "openTime" => TimetoSec($timePerQ),
- "marker" => "3"
- );
- }
- }
- /*
- * Mögliche ankommende Requests die verarbeitet werden müssen:
- * 1. Erster Auruf, keine Frage & Antwort übermittelt
- * 2. Aufruf mit GET Parametern die antworten.
- */
- if(isset($_GET["quiz"])){
- /*
- * User hat eine Antwort und eine Quiz ID übermittelt. Infos einladen und prüfen
- * Ergebnis validieren und speichern dann falls Verfügbar nächste Frage zurückgeben
- * Schritt1: SELECT qergebnisse WHERE FRAGE ID = übermittelte
- * Schritt2: antwortzeit valid?
- * Schritt3: UPDATE qergebnisse mit endtime und antwort
- */
- $userdataQuizID = htmlspecialchars($_GET["quiz"]); // QuizID übermittelt
- $userdataFrageID = htmlspecialchars($_GET["frage"]); // FrageID übermittelt
- $userdataAntwort = htmlspecialchars($_GET["antwort"]); // FrageID übermittelt
- $timePerQ; // TimepPerQuestion
- $quizID; // valide Quiz ID aus der DB
- if($quizID != $userdataQuizID){
- exit("Es wurde versucht eine Frage fuer ein Quiz zu uebermitteln fuer das der User nicht angemeldet ist");
- }
- /*
- * damit nicht manipuliert werden kann wird die ROW id doch nicht beachtet. es wird immer nur die letzte frage zum beantworten freigegeben.
- * stützt sich auf die Funktion dass sich ein user nicht für 2 Quize anmelden kann
- */
- $sql = "SELECT *, qergebnisse.id AS 'rowID' FROM `qergebnisse` INNER JOIN fpool ON qergebnisse.fid = fpool.id WHERE `endTime` IS NULL AND `kuerzel`= :kuerzel HAVING TIMEDIFF( NOW(), `openTime`) < '".$timePerQ."' ORDER BY `openTime` DESC LIMIT 1";
- $q = $db->prepare($sql);
- $q->execute(array(
- ':kuerzel'=> $clientKuerzel,
- ));
- $offeneFrage = $q->fetch();
- if( $offeneFrage == false) {
- /*
- * Der User hat versucht auf eine bereits abgelaufene Frage zu antworten, die nächste Frage wird ausgegeben und das Script dann verlassen
- */
- echo stripslashes(json_encode(getQuestion($db, $timeX, $random,$timePerQ,$clientKuerzel,$quizID)));
- exit();
- }
- if($userdataFrageID!= $offeneFrage["id"]){
- exit("user versucht falsche Frage zu beantworten");
- }
- /*
- * Läuft das Script bis hier hin ist alles Verifiziert und valide, daten können eingetragen werden
- */
- $sql = "UPDATE `qergebnisse` SET `endTime`=NOW(),`response`=:antwort WHERE `id` = :rowID ";
- $q = $db->prepare($sql);
- $q->execute(array(
- ':antwort'=> $userdataAntwort,
- 'rowID' => $offeneFrage["rowID"]
- ));
- echo stripslashes(json_encode(getQuestion($db, $timeX, $random,$timePerQ,$clientKuerzel,$quizID)));
- } else {
- /*
- * Keine Frage wurde übermittelt, gib die nächste Frage aus.
- */
- echo stripslashes(json_encode(getQuestion($db, $timeX, $random,$timePerQ,$clientKuerzel,$quizID)));
- }
- ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement