2
////Handels quiz answers
3
////Parameters: loginName, courseName, courseOccasion, quizNr, 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
10
//Check if the sent login name is the same as the one stored in the session
11
if($_POST['loginName']==$_SESSION['loginName'] && $_POST['courseName']==$_SESSION['courseName'] && $_POST['quizNr']==$_SESSION['quizNr']){
13
//Store answer and loginName+answer hash
14
function storeAnswer($loginName,$courseName,$courseOccasion,$quizNr,$qVarRr,$quizAnswer,$grade,$gradeComment,$ip,$userAgent,$pdo){
15
$updateQuery="UPDATE AssignedQuizzes
16
SET AssignedQuizzes.answer=:ANSWER,
17
AssignedQuizzes.answerHash=:ANSWERHASH,
18
AssignedQuizzes.grade=:GRADE,
19
AssignedQuizzes.gradeComment=:GRADECOMMENT,
20
AssignedQuizzes.answeredDateTime=:DATETIME,
21
AssignedQuizzes.userAgent=:AGENT,
22
AssignedQuizzes.userIP=:IP
23
WHERE AssignedQuizzes.ssn=(SELECT Student.ssn FROM Student WHERE Student.loginName=:LOGIN)
24
AND AssignedQuizzes.quizNr=:QNR
25
AND AssignedQuizzes.quizCourseName=:CNAME
26
AND AssignedQuizzes.courseOccasion=:COCCASION;";
27
$updateStmt = $pdo->prepare($updateQuery);
28
$updateStmt->bindParam(':LOGIN', $loginName);
29
$updateStmt->bindParam(':CNAME', $courseName);
30
$updateStmt->bindParam(':QNR', $quizNr);
31
$updateStmt->bindParam(':COCCASION', $courseOccasion);
32
$updateStmt->bindParam(':ANSWER', $quizAnswer);
33
$hashedAnswer=md5($loginName.$quizAnswer);
34
$updateStmt->bindParam(':ANSWERHASH', $hashedAnswer);
35
$updateStmt->bindParam(':GRADE', $grade);
36
$updateStmt->bindParam(':GRADECOMMENT', $gradeComment);
38
$dateString=$now->format('Y-m-d H:i:s');
39
$updateStmt->bindParam(':DATETIME', $dateString); // date and time formated to string e.g. "2012-08-23 08:59:00"
40
$updateStmt->bindParam(':IP',$ip);
41
$updateStmt->bindParam(':AGENT',$userAgent);
43
return $updateStmt->execute();
47
//Prevents browsers (IE) from caching the response
48
header('Cache-Control: no-cache, must-revalidate');
49
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
50
header('Content-type: application/json; charset=utf-8');
52
include "dbconnect.php";
54
//TODO: Store ALL answer attempts in answerlog
55
// CREATE TABLE AssignedQuizzesAnswerLog(
56
// ssn CHAR(11), /*YYMMDD-XXXX*/
57
// loginName VARCHAR(50),
60
// quizCourseName VARCHAR(200),
61
// courseOccasion VARCHAR(25),
62
// answerHash VARCHAR(255), /*Hash of Student login name + answer */
66
// answeredDateTime TIMESTAMP,
67
// userAgent VARCHAR(1024), /*$_SERVER['HTTP_USER_AGENT']*/
68
// userIP VARCHAR(20) /*$_SERVER['REMOTE_ADDR']*/
69
// ) ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_swedish_ci;
70
$insertString = "INSERT INTO AssignedQuizzesAnswerLog(
85
(SELECT Student.ssn FROM Student WHERE Student.loginName=:LOGIN),
88
(SELECT AssignedQuizzes.qVarNr
89
FROM AssignedQuizzes, Student
90
WHERE Student.ssn=AssignedQuizzes.ssn
91
AND AssignedQuizzes.quizNr=:QNR
92
AND Student.loginName=:LOGIN
93
AND AssignedQuizzes.quizCourseName=:CNAME
94
AND AssignedQuizzes.courseOccasion=:COCCASION),
104
$stmt = $pdo->prepare($insertString);
105
$stmt->bindParam(':QNR', $_POST['quizNr']);
106
$stmt->bindParam(':LOGIN', $_POST['loginName']);
107
$stmt->bindParam(':CNAME', $_POST['courseName']);
108
$stmt->bindParam(':COCCASION', $_POST['courseOccasion']);
109
$stmt->bindParam(':ANSWER', $_POST['quizAnswer']);
110
$hashedAnswer=md5($_POST['loginName'].$_POST['quizAnswer']);
111
$stmt->bindParam(':AHASH', $hashedAnswer);
112
$stmt->bindParam(':UAGENT', $_SERVER['HTTP_USER_AGENT']);
114
$dateString=$now->format('Y-m-d H:i:s');
115
$stmt->bindParam(':ADATETIME', $dateString); // date and time formated to string e.g. "2012-08-23 08:59:00"
116
$stmt->bindParam(':UIP', $_SERVER['REMOTE_ADDR']);
119
//Check if the student is a praticipant of the course
120
$queryString="SELECT COUNT(*)
121
FROM Student, StudentCourseRegistration
122
WHERE Student.ssn=StudentCourseRegistration.studentSsn
123
AND Student.loginName=:LOGIN
124
AND Student.passw=:PASSW
125
AND courseName=:CNAME
126
AND courseOccasion=:COCCASION;";
127
$stmt = $pdo->prepare($queryString);
128
$stmt->bindParam(':LOGIN', $_SESSION['loginName']);
129
$stmt->bindParam(':PASSW', $_SESSION['password']);
130
$stmt->bindParam(':CNAME', $_SESSION['courseName']);
131
$stmt->bindParam(':COCCASION', $_SESSION['courseOccasion']);
134
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)
135
//Check if quiz is open (and fetch auto correction setting)
136
$queryString="SELECT Quiz.opening, Quiz.closing, Quiz.autoCorrected, Quiz.allowMultipleReplies
139
AND Quiz.courseName=:CNAME;";
140
$stmt = $pdo->prepare($queryString);
141
$stmt->bindParam(':QNR', $_POST['quizNr']);
142
$stmt->bindParam(':CNAME', $_POST['courseName']);
144
$quizData=$stmt->fetch(PDO::FETCH_ASSOC);
147
$now = new DateTime();
148
$opening = new DateTime($quizData['opening']);
149
$closing = new DateTime($quizData['closing']);
151
if($now<$opening) { //Quiz is not open yet
152
echo json_encode(array('Error' => 'Requested quiz is not open yet'));
154
} else if($now>$closing) { //Quiz is closed
155
echo json_encode(array('Error' => 'Requested quiz is closed'));
157
} // else continue (Not the best coding practice...)
159
} else { //Quiz does not exist
160
echo json_encode(array('Error' => 'Requested quiz does not exist'));
166
ssn CHAR(11), //YYMMDD-XXXX
169
quizCourseName VARCHAR(200),
170
courseOccasion VARCHAR(25) NOT NULL,
171
answerHash VARCHAR(255), //Hash of Student login name + answer
175
answeredDateTime TIMESTAMP,
176
userAgent VARCHAR(1024),
177
userIP VARCHAR(20), //$_SERVER['REMOTE_ADDR']
178
PRIMARY KEY(ssn, qVarNr, quizNr, quizCourseName),
181
//Check if student already has answered the assigned quiz variant
182
$queryString="SELECT AssignedQuizzes.answerHash, AssignedQuizzes.qVarNr, AssignedQuizzes.gradeComment
183
FROM AssignedQuizzes, Student
184
WHERE Student.ssn=AssignedQuizzes.ssn
185
AND AssignedQuizzes.quizNr=:QNR
186
AND Student.loginName=:LOGIN
187
AND AssignedQuizzes.quizCourseName=:CNAME
188
AND AssignedQuizzes.courseOccasion=:COCCASION;";
189
$stmt = $pdo->prepare($queryString);
190
$stmt->bindParam(':QNR', $_POST['quizNr']);
191
$stmt->bindParam(':LOGIN', $_POST['loginName']);
192
$stmt->bindParam(':CNAME', $_POST['courseName']);
193
$stmt->bindParam(':COCCASION', $_POST['courseOccasion']);
195
$result=$stmt->fetch(PDO::FETCH_ASSOC);
196
$stmt->closeCursor();
197
if($result){ //If this quiz is assigned to the student
198
if($result['answerHash']!=NULL && $quizData['allowMultipleReplies']!='1'){ //Student has already answered the quiz
199
echo json_encode(array('Error' => 'This quiz has already been answered', 'answerHash'=>$result['answerHash']));
201
} else { //check if autoCorrection
203
if($quizData['autoCorrected']=='0'){ //Not auto corrected
204
$hashedAnswer= substr(md5($_POST['loginName'].$_POST['quizAnswer']),0,8);
205
if(storeAnswer($_POST['loginName'],
206
$_POST['courseName'],
207
$_POST['courseOccasion'],
210
$_POST['quizAnswer'],
212
$result['gradeComment']."-",
213
$_SERVER['REMOTE_ADDR'],
214
$_SERVER['HTTP_USER_AGENT'],
217
echo json_encode(array('Success' => 'true','hashedAnswer' => $hashedAnswer));
219
//Failed to store answer
220
echo json_encode(array('Success' => 'false','hashedAnswer' => $hashedAnswer));
223
} else { //Is auto corrected - Check if the correct answer was given
227
quizCourseName VARCHAR(200),
228
correctAnswer VARCHAR(255),
230
PRIMARY KEY(qVarNr, quizNr, quizCourseName),
232
$queryString = "SELECT QuizVariant.correctAnswer
234
WHERE QuizVariant.qVarNr=:QVNR
235
AND QuizVariant.quizNr=:QNR
236
AND QuizVariant.quizCourseName=:CNAME";
237
$stmt = $pdo->prepare($queryString);
238
$stmt->bindParam(':QNR', $_POST['quizNr']);
239
$stmt->bindParam(':QVNR', $result['qVarNr']);
240
$stmt->bindParam(':CNAME', $_POST['courseName']);
242
$qVarData=$stmt->fetch(PDO::FETCH_ASSOC);
243
$correctAnswer=$qVarData['correctAnswer'];
244
if($_POST['quizAnswer']==$correctAnswer){ //Correct answer was given
245
$hashedAnswer= substr(md5($_POST['loginName'].$_POST['quizAnswer']),0,8);
246
$stmt->closeCursor();
247
if(storeAnswer($_POST['loginName'],
248
$_POST['courseName'],
249
$_POST['courseOccasion'],
252
$_POST['quizAnswer'],
254
$result['gradeComment']." Quiz was corrected automatically",
255
$_SERVER['REMOTE_ADDR'],
256
$_SERVER['HTTP_USER_AGENT'],
259
echo json_encode(array('Success' => 'true', 'isCorrect' => 'true', 'hashedAnswer' => $hashedAnswer));
261
//Failed to store answer
262
echo json_encode(array('Success' => 'false', 'isCorrect' => 'true', 'hashedAnswer' => $hashedAnswer));
265
} else { //Answer is incorrect
267
echo json_encode(array('isCorrect' => 'false'));
273
echo json_encode(array('Error' => 'This student has not been assigned the quiz'));
278
echo json_encode(array('Error' => 'Student not registered for this course'));
281
} else { //Sent login name does not match the login name stored in the session
282
echo json_encode(array('Error' => 'Sent login name does not match stored login name'));
b'\\ No newline at end of file'