2
////Handels quiz answers
3
////Parameters: loginName, password, courseName, courseOccasion, quizNr, qVarNr, quizAnswer
4
////If autoCorrection==false the answer is stored without checking
5
////Else the quiz answer is checked for correctness,
6
//// if incorrect the answer is not stored, else stored
8
//Store answer and loginName+answer hash
9
function storeAnswer($loginName,$password,$courseName,$courseOccasion,$quizNr,$qVarNr,$quizAnswer,$grade,$gradeComment,$ip,$userAgent,$pdo){
10
$updateQuery="UPDATE AssignedQuizzes
11
SET AssignedQuizzes.answer=:ANSWER,
12
AssignedQuizzes.answerHash=:ANSWERHASH,
13
AssignedQuizzes.grade=:GRADE,
14
AssignedQuizzes.gradeComment=:GRADECOMMENT,
15
AssignedQuizzes.answeredDateTime=:DATETIME,
16
AssignedQuizzes.userAgent=:AGENT,
17
AssignedQuizzes.userIP=:IP
18
WHERE AssignedQuizzes.ssn=(SELECT Student.ssn FROM Student WHERE Student.loginName=:LOGIN AND Student.passw=:PASSW)
19
AND AssignedQuizzes.quizNr=:QNR
20
AND AssignedQuizzes.qVarNr=:QVNR
21
AND AssignedQuizzes.quizCourseName=:CNAME
22
AND AssignedQuizzes.courseOccasion=:COCCASION;";
23
$updateStmt = $pdo->prepare($updateQuery);
24
$updateStmt->bindParam(':LOGIN', $loginName);
25
$updateStmt->bindParam(':CNAME', $courseName);
26
$updateStmt->bindParam(':QNR', $quizNr);
27
$updateStmt->bindParam(':QVNR', $qVarNr);
28
$updateStmt->bindParam(':COCCASION', $courseOccasion);
29
$updateStmt->bindParam(':ANSWER', $quizAnswer);
30
$hashedAnswer= md5($loginName.$quizAnswer);
31
$updateStmt->bindParam(':ANSWERHASH', $hashedAnswer);
32
$updateStmt->bindParam(':GRADE', $grade);
33
$updateStmt->bindParam(':GRADECOMMENT', $gradeComment);
35
$dateString=$now->format('Y-m-d H:i:s');
36
//$updateStmt->bindParam(':DATETIME', new DateTime()->format('Y-m-d H:i:s')); // date and time formated to string e.g. "2012-08-23 08:59:00"
37
$updateStmt->bindParam(':DATETIME', $dateString); // date and time formated to string e.g. "2012-08-23 08:59:00"
38
$updateStmt->bindParam(':PASSW',$password);
39
$updateStmt->bindParam(':IP',$ip);
40
$updateStmt->bindParam(':AGENT',$userAgent);
41
return $updateStmt->execute();
45
//Prevents browsers (IE) from caching the response
46
header('Cache-Control: no-cache, must-revalidate');
47
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
48
header('Content-type: application/json; charset=utf-8');
50
include "dbconnect.php";
52
//Check if the student is a praticipant of the course
53
$queryString="SELECT COUNT(*)
54
FROM Student, StudentCourseRegistration
55
WHERE Student.ssn=StudentCourseRegistration.studentSsn
56
AND Student.loginName=:LOGIN
57
AND Student.passw=:PASSW
59
AND courseOccasion=:COCCASION;";
60
$stmt = $pdo->prepare($queryString);
61
$stmt->bindParam(':LOGIN', $_POST['loginName']);
62
$stmt->bindParam(':PASSW', $_POST['password']);
63
$stmt->bindParam(':CNAME', $_POST['courseName']);
64
$stmt->bindParam(':COCCASION', $_POST['courseOccasion']);
67
if($stmt->fetchColumn()==1){ //Student is registered for the course - COUNT result read from the first column of the next unread row (i.e. the first row)
68
//Check if quiz is open (and fetch auto correction setting)
69
$queryString="SELECT Quiz.opening, Quiz.closing, Quiz.autoCorrected
72
AND Quiz.courseName=:CNAME;";
73
$stmt = $pdo->prepare($queryString);
74
$stmt->bindParam(':QNR', $_POST['quizNr']);
75
$stmt->bindParam(':CNAME', $_POST['courseName']);
77
$quizData=$stmt->fetch(PDO::FETCH_ASSOC);
80
$now = new DateTime();
81
$opening = new DateTime($quizData['opening']);
82
$closing = new DateTime($quizData['closing']);
84
if($now<$opening) { //Quiz is not open yet
85
echo json_encode(array('Error' => 'Requested quiz is not open yet'));
87
} else if($now>$closing) { //Quiz is closed
88
echo json_encode(array('Error' => 'Requested quiz is closed'));
90
} // else continue (Not the best coding practice...)
92
} else { //Quiz does not exist
93
echo json_encode(array('Error' => 'Requested quiz does not exist'));
98
ssn CHAR(11), //YYMMDD-XXXX
101
quizCourseName VARCHAR(200),
102
courseOccasion VARCHAR(25) NOT NULL,
103
answerHash VARCHAR(255), //Hash of Student login name + answer
107
answeredDateTime TIMESTAMP,
108
userAgent VARCHAR(1024),
109
userIP VARCHAR(20), //$_SERVER['REMOTE_ADDR']
110
PRIMARY KEY(ssn, qVarNr, quizNr, quizCourseName),
113
//Check if student already has answered the assigned quiz variant
114
$queryString="SELECT AssignedQuizzes.answerHash
115
FROM AssignedQuizzes, Student
116
WHERE Student.ssn=AssignedQuizzes.ssn
117
AND AssignedQuizzes.quizNr=:QNR
118
AND AssignedQuizzes.qVarNr=:QVARNR
119
AND Student.loginName=:LOGIN
120
AND AssignedQuizzes.quizCourseName=:CNAME
121
AND AssignedQuizzes.courseOccasion=:COCCASION;";
122
$stmt = $pdo->prepare($queryString);
123
$stmt->bindParam(':QNR', $_POST['quizNr']);
124
$stmt->bindParam(':QVARNR', $_POST['qVarNr']);
125
$stmt->bindParam(':LOGIN', $_POST['loginName']);
126
$stmt->bindParam(':CNAME', $_POST['courseName']);
127
$stmt->bindParam(':COCCASION', $_POST['courseOccasion']);
129
$result=$stmt->fetch(PDO::FETCH_ASSOC);
130
if($result){ //If there is a quiz variant assigned to the student
131
if($result['answerHash']!=NULL){ //Student has already answered the quiz
132
echo json_encode(array('Error' => 'This quiz has already been answered', 'answerHash'=>$result['answerHash']));
134
} else { //check if autoCorrection
136
if($quizData['autoCorrected']=='0'){ //Not auto corrected
137
if(storeAnswer($_POST['loginName'],
139
$_POST['courseName'],
140
$_POST['courseOccasion'],
143
$_POST['quizAnswer'],
146
$_SERVER['REMOTE_ADDR'],
147
$_SERVER['HTTP_USER_AGENT'],
150
echo json_encode(array('Success' => 'true'));
152
//Failed to store answer
153
echo json_encode(array('Success' => 'false'));
156
} else { //Is auto corrected - Check if the correct answer was given
160
quizCourseName VARCHAR(200),
161
correctAnswer VARCHAR(255),
163
PRIMARY KEY(qVarNr, quizNr, quizCourseName),
165
$queryString = "SELECT QuizVariant.correctAnswer
167
WHERE QuizVariant.qVarNr=:QVNR
168
AND QuizVariant.quizNr=:QNR
169
AND QuizVariant.quizCourseName=:CNAME";
170
$stmt = $pdo->prepare($queryString);
171
$stmt->bindParam(':QNR', $_POST['quizNr']);
172
$stmt->bindParam(':QVNR', $_POST['qVarNr']);
173
$stmt->bindParam(':CNAME', $_POST['courseName']);
175
$qVarData=$stmt->fetch(PDO::FETCH_ASSOC);
176
$correctAnswer=$qVarData['correctAnswer'];
177
if($_POST['quizAnswer']==$correctAnswer){ //Correct answer was given
178
$hashedAnswer= md5($_POST['loginName'].$_POST['quizAnswer']);
180
if(storeAnswer($_POST['loginName'],
182
$_POST['courseName'],
183
$_POST['courseOccasion'],
186
$_POST['quizAnswer'],
188
"Quiz was corrected automatically",
189
$_SERVER['REMOTE_ADDR'],
190
$_SERVER['HTTP_USER_AGENT'],
193
echo json_encode(array('Success' => 'true', 'isCorrect' => 'true', 'hashedAnswer' => $hashedAnswer));
195
//Failed to store answer
196
echo json_encode(array('Success' => 'false', 'isCorrect' => 'true', 'hashedAnswer' => $hashedAnswer));
199
} else { //Answer is incorrect
200
echo json_encode(array('isCorrect' => 'false'));
206
echo json_encode(array('Error' => 'This student has not been assigned the quiz'));
211
echo json_encode(array('Error' => 'Student not registered for this course (or incorrect password was sent)'));
b'\\ No newline at end of file'