Advertisement
Guest User

Untitled

a guest
Jan 28th, 2015
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 10.59 KB | None | 0 0
  1. <?php
  2. /**
  3.  * Date: 09.01.2015
  4.  * Time: 22:19
  5.  */
  6.  
  7. include("mysql.php");
  8.  
  9. /*
  10.  *  Übermittelt wird:
  11.  *  kuerzel
  12.  */
  13.  
  14. /*
  15.  * Ausgeführt werden soll
  16.  *      Ist für den User schon eine Frage offen?
  17.  *          > Checke die Zeit für diese frage
  18.  *              Frage gefunden die keine antwort hat
  19.  *              und noch Zeit übrig?
  20.  *                  ist sie auch teil des Quiz? return                                    !!
  21.  *
  22.  *              Frage ohne antwort aber ohne Zeit über?
  23.  *                  close().frage
  24.  *
  25.  *              geb eine Frage aus
  26.  *                  if Quiz.random = 1 => mixed, sonst linear
  27.  *              erstelle für die Frage eine Zeile in der Ergebnistabelle, offen, zeitpuntk der ausgabe
  28.  */
  29.  
  30.  
  31. /*
  32.  * zurückgegeben wird:
  33.  *      {
  34.  *         frage = "text".
  35.  *         antwort = ["antwort", "antwort" ,...]
  36.  *
  37.  *      }
  38.  *
  39.  *  Bei Authentifikationsproblem => header status code 401
  40.  *
  41.  *
  42.  *
  43.  *
  44.  *
  45.  * Dazu kommt nun die Implementierung der Anmeldezeit bzw die berücksichtigung derer im questionCtrl,
  46.  * anmeldeZeit ist in der timex variable aus der mysql.php/ ToDo: in Config umbennen?
  47.  * Funktion muss nur beim First-Call eingebaut werden,
  48.  * kann auch bei bereits bestehenden offenen fragen vernachlässigt werden
  49.  * Um Zeile 70 rum sollte man mit der SQL Abfrage an die Zeit kommen
  50.  *
  51.  *
  52.  *
  53.  *
  54.  *
  55.  */
  56.  
  57.  
  58. if(checktoken() != true){
  59.     exit("AUTH ERROR 401");
  60. }
  61.  
  62.  
  63.  
  64.  
  65.  
  66. $clientToken = htmlspecialchars($_COOKIE['XSRF-TOKEN']);
  67. $clientKuerzel = htmlspecialchars($_COOKIE['KUERZEL']);
  68.  
  69.  
  70. $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";
  71. $stmt = $db->prepare($sql);
  72. $stmt->execute(array(
  73.     ":kuerzel" =>$clientKuerzel
  74. ));
  75. $row1 = $stmt->fetch();
  76. //  wenn $row inhalt hat, dann ist das Quiz aktiv und fragenkönnen ausgegeben werden
  77. if( $row1 == false) {
  78.     exit('{"status": "anmeldefehler"}');
  79. }
  80.  
  81.  
  82. // Geg: Startzeit & tokenX
  83. // Quiz darf erst starten wenn Startzeit + tokenX < now
  84. // 2015-01-25 10:17:53
  85.  
  86.  
  87.  
  88.  $past = strtotime( $row1["startzeit"])+$timeXs;
  89.  $now = time();
  90. if($past >= $now){
  91.     echo '{"status": "quizStillStarting"}';
  92.     exit();
  93. }
  94.  
  95.  
  96.  
  97.  
  98.  
  99. $random = $row1["random"];      // Ist das Quiz Random?
  100. $timePerQ = $row1["timePerQ"];  // TimepPerQuestion
  101. $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)
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117. function getQuestion($db,$timeX,  $random,$timePerQ,$clientKuerzel, $quizID) {
  118.  
  119.  
  120.  
  121.     // return "frage kann  ausgegeben werden fuer User".$row['users-kuerzel']."im quiz mit der instanz id: ".$row['id'];
  122.  
  123.  
  124. // check nach offener Frage
  125. // Selektiere alle Fragen mit :
  126. //      1. endzeit = 0:00
  127. //      2. startzeit + $timePerQ > jetzt
  128. //      3. user id
  129. // SELECT * FROM `qergebnisse` HAVING TIMEDIFF(`openTime`, '2015-01-13 19:02:01') >2
  130. // SELECT * FROM `qergebnisse` HAVING TIMEDIFF(`openTime`, '2015-01-13 19:10:01') > 20
  131. //
  132. //  SELECT * FROM `qergebnisse` WHERE `endTime` IS NULL  HAVING TIMEDIFF( '2015-01-13 19:10:01', `openTime`) < '00:11:00.000'
  133. //  SELECT * FROM `qergebnisse` WHERE `endTime` IS NULL  HAVING TIMEDIFF( NOW(), `openTime`) < '00:11:00.000'
  134. // SELECT * FROM `qergebnisse` WHERE `endTime` IS NULL AND `kuerzel`= :kuerzel  HAVING TIMEDIFF( NOW(), `openTime`) < '".$timePerQ."'
  135. //
  136. //
  137. //
  138. //
  139. //
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.     $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."'";
  147.     $stmt = $db->prepare($sql);
  148.     $stmt->execute(array(
  149.         ":kuerzel" =>$clientKuerzel
  150.     ));
  151.     $row = $stmt->fetch();
  152.     if( $row != false) {
  153.  
  154.  
  155.         /*
  156.  * Es ist noch eine Frage offen :
  157.  */
  158.  
  159.  
  160.  
  161.         return array(
  162.             "frageID" => $row["fid"],
  163.             //"antwortID" => $row["id"],
  164.             "qID" => $row["qid"],
  165.             "rowID" => $row["rowID"],
  166.             "frage" => $row["frage"],
  167.             "antworten"=> array(
  168.                 "antwort1" => $row["antwort1"],
  169.                 "antwort2" => $row["antwort2"],
  170.                 "antwort3" => $row["antwort3"],
  171.                 "antwort4" => $row["antwort4"]
  172.             ),
  173.  
  174.             "level" => $row["level"],
  175.             "openTime" =>countdownRechner($row["openTime"], $timePerQ),
  176.             "marker" => "1"
  177.         );
  178.     }
  179.  
  180.  
  181.     /*
  182.      * Es ist noch keine Frage offen, wichtig , auf die order achten, lade neue fragen:
  183.      */
  184.  
  185.  
  186.  
  187. // Linear:
  188.     if($random == 0) {
  189.  
  190.  
  191.         $sql = "select *,  f.id AS fragenID
  192. FROM fpool f
  193.  
  194. where f.id not in( select fid as id from qergebnisse WHERE kuerzel =:kuerzel)
  195. AND f.`qinstanz-id` =:quiz
  196. ORDER BY f.order ASC limit 1
  197. ";
  198.         $stmt = $db->prepare($sql);
  199.         $stmt->execute(array(
  200.             ":kuerzel" =>$clientKuerzel,
  201.             ":quiz"=>$quizID
  202.         ));
  203.         $row2 = $stmt->fetch();
  204.  
  205.  
  206.  
  207.  
  208.  
  209.         //  frage session wird eröffnet
  210.         $sql = "INSERT INTO qergebnisse (kuerzel,qid, fid) VALUES (:kuerzel,:qid,:fid)";
  211.         $q = $db->prepare($sql);
  212.         $q->execute(array(
  213.             ':kuerzel'=> $clientKuerzel,
  214.             ':qid'=> $row2["qinstanz-id"],
  215.             ':fid'=>$row2["fragenID"],
  216.         ));
  217.         if( $row2 == false) {
  218.             exit('{"status":"ende"}');
  219.         }
  220.  
  221.  
  222.  
  223.  
  224.         return  array(
  225.             "frageID" => $row2["id"],
  226.             //!! was ist das nochmal  "antwortID" => $row2["id"],
  227.             "qID" => $row2["qinstanz-id"],
  228.             "frage" => $row2["frage"],
  229.             "antworten"=> array(
  230.                 "antwort1" => $row2["antwort1"],
  231.                 "antwort2" => $row2["antwort2"],
  232.                 "antwort3" => $row2["antwort3"],
  233.                 "antwort4" => $row2["antwort4"]
  234.             ),
  235.  
  236.             "level" => $row2["level"],
  237.             "openTime"=> TimetoSec($timePerQ),      //"openTime" => countdownRechner($row2["openTime"], $timePerQ), // Open time = timePerQ
  238.             "marker" => "2"
  239.  
  240.         );
  241.  
  242.  
  243.     } else {
  244.         $sql = "select *,  f.id AS fragenID
  245. FROM fpool f
  246.  
  247. where f.id not in( select fid as id from qergebnisse WHERE kuerzel =:kuerzel)
  248. AND f.`qinstanz-id` =:quiz
  249. ORDER BY RAND() LIMIT 1
  250.  
  251. ";
  252.  
  253.  
  254.  
  255.  
  256.  
  257.         $stmt = $db->prepare($sql);
  258.         $stmt->execute(array(
  259.        ":kuerzel" =>$clientKuerzel,
  260.             ":quiz" => $quizID
  261.         ));
  262.         $row2 = $stmt->fetch();
  263.  
  264.  
  265.  
  266.         //  frage session wird eröffnet
  267.         $sql = "INSERT INTO qergebnisse (kuerzel,qid, fid) VALUES (:kuerzel,:qid,:fid)";
  268.         $q = $db->prepare($sql);
  269.         $q->execute(array(
  270.             ':kuerzel'=> $clientKuerzel,
  271.             ':qid'=> $row2["qinstanz-id"],
  272.             ':fid'=>$row2["fragenID"],
  273.         ));
  274.  
  275.  
  276.         if( $row2 == false) {
  277.             exit('{"status":"ende"}');
  278.         }
  279.  
  280.  
  281.  
  282.  
  283.         return  array(
  284.             "frageID" => $row2["id"],
  285.             //!! was ist das nochmal  "antwortID" => $row2["id"],
  286.             "qID" => $row2["qinstanz-id"],
  287.             "frage" => $row2["frage"],
  288.             "antworten"=> array(
  289.                 "antwort1" => $row2["antwort1"],
  290.                 "antwort2" => $row2["antwort2"],
  291.                 "antwort3" => $row2["antwort3"],
  292.                 "antwort4" => $row2["antwort4"]
  293.             ),
  294.  
  295.             "level" => $row2["level"],
  296.             "openTime" => TimetoSec($timePerQ),
  297.             "marker" => "3"
  298.  
  299.         );
  300.  
  301.     }
  302.  
  303.  
  304. }
  305.  
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314.  
  315.  
  316.  
  317.  
  318.  
  319. /*
  320.  * Mögliche ankommende Requests die verarbeitet werden müssen:
  321.  *      1. Erster Auruf, keine Frage & Antwort übermittelt
  322.  *      2. Aufruf mit GET Parametern die antworten.
  323.  */
  324.  
  325.  
  326.  
  327.  
  328.  
  329. if(isset($_GET["quiz"])){
  330.     /*
  331.      * User hat eine Antwort und eine Quiz ID übermittelt. Infos einladen und prüfen
  332.      * Ergebnis validieren und speichern dann falls Verfügbar nächste Frage zurückgeben
  333.      * Schritt1: SELECT qergebnisse WHERE FRAGE ID = übermittelte
  334.      * Schritt2: antwortzeit valid?
  335.      * Schritt3: UPDATE qergebnisse mit endtime und antwort
  336.      */
  337.  
  338.     $userdataQuizID = htmlspecialchars($_GET["quiz"]);          // QuizID übermittelt
  339.     $userdataFrageID =  htmlspecialchars($_GET["frage"]);       // FrageID übermittelt
  340.     $userdataAntwort =  htmlspecialchars($_GET["antwort"]);       // FrageID übermittelt
  341.     $timePerQ;                                                  // TimepPerQuestion
  342.     $quizID;                                                    // valide Quiz ID aus der DB
  343.  
  344.  
  345.     if($quizID != $userdataQuizID){
  346.         exit("Es wurde versucht eine Frage fuer ein Quiz zu uebermitteln fuer das der User nicht angemeldet ist");
  347.     }
  348.  
  349.     /*
  350.     * damit nicht manipuliert werden kann wird die ROW id doch nicht beachtet. es wird immer nur die letzte frage zum beantworten freigegeben.
  351.      * stützt sich auf die Funktion dass sich ein user nicht für 2 Quize anmelden kann
  352.     */
  353.  
  354.     $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";
  355.     $q = $db->prepare($sql);
  356.     $q->execute(array(
  357.         ':kuerzel'=> $clientKuerzel,
  358.     ));
  359.     $offeneFrage = $q->fetch();
  360.  
  361.     if( $offeneFrage == false) {
  362.  
  363.         /*
  364.          * Der User hat versucht auf eine bereits abgelaufene Frage zu antworten,  die nächste Frage wird ausgegeben und das Script dann verlassen
  365.          */
  366.  
  367.         echo stripslashes(json_encode(getQuestion($db, $timeX, $random,$timePerQ,$clientKuerzel,$quizID)));
  368.         exit();
  369.     }
  370.  
  371.  
  372.  
  373.     if($userdataFrageID!= $offeneFrage["id"]){
  374.         exit("user versucht falsche Frage zu beantworten");
  375.     }
  376.  
  377.  
  378.     /*
  379.      * Läuft das Script bis hier hin ist alles Verifiziert und valide, daten können eingetragen werden
  380.      */
  381.  
  382.  
  383.  
  384.     $sql = "UPDATE `qergebnisse` SET `endTime`=NOW(),`response`=:antwort WHERE `id` = :rowID ";
  385.     $q = $db->prepare($sql);
  386.     $q->execute(array(
  387.         ':antwort'=> $userdataAntwort,
  388.         'rowID' => $offeneFrage["rowID"]
  389.     ));
  390.  
  391.  
  392.     echo stripslashes(json_encode(getQuestion($db, $timeX, $random,$timePerQ,$clientKuerzel,$quizID)));
  393.  
  394.  
  395.  
  396. } else {
  397.     /*
  398.      * Keine Frage wurde übermittelt, gib die nächste Frage aus.
  399.      */
  400.     echo stripslashes(json_encode(getQuestion($db, $timeX, $random,$timePerQ,$clientKuerzel,$quizID)));
  401.  
  402. }
  403.  
  404.  
  405.  
  406.  
  407.  
  408. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement