subversion://[vpntest]/release/2.0/WWW/index.php Log in
ViewVC logotype

Annotate of /release/2.0/WWW/index.php

Parent Directory Parent Directory | Revision Log Revision Log

Revision 9 - (show annotations) (download) (as text)
Sun Feb 17 15:07:41 2008 MSK (12 years, 9 months ago) by vitalif
File MIME type: text/x-php; charset=windows-1251
File size: 16673 byte(s)
Release 2.0

1 <?php
2
3 // Интерфейс аутентификации + тестирования
4 // Copyright (c) 2006, Виталий Филиппов [VMX]
5
6 require_once 'lib/config.php';
7 require_once 'lib/auth_sc.php';
8 require_once 'lib/info.php';
9 error_reporting (E_ALL & ~E_NOTICE);
10 mysql_start();
11
12 function delnull (&$a)
13 {
14 for ($i = 0; $i < count ($a); $i++)
15 {
16 if (strlen($a[$i]) == 0)
17 {
18 for ($j = $i; $j < count ($a)-1; $j++)
19 $a[$j] = $a[$j+1];
20 unset ($a[count($a)-1]);
21 }
22 }
23 }
24
25 function putFrmLogin ($login_incorrect)
26 {
27 global $phpbb_path;
28 $str = query_str_replace ($_SERVER['QUERY_STRING'], 'logout', '');
29 echo "<form action=\"?$str\" method=\"POST\">
30 <table bgcolor=\"#E0E0FF\" width=\"700\" align=\"center\">\n";
31 if ($login_incorrect)
32 echo "<tr><td align=\"center\" colspan=2><p class=\"frmLoginText\">Данные неверны</p></td></tr>";
33 echo "<tr>
34 <td width=\"40%\"><p align=\"right\" class=\"frmLoginText\">Логин:</p></td>
35 <td><input name=\"loginedit\" type=\"text\" maxlength=\"256\" class=\"frmLoginEdit\"></td>
36 </tr>
37 <tr>
38 <td><p align=\"right\" class=\"frmLoginText\">Пароль:</p></td>
39 <td><input name=\"passedit\" type=\"password\" maxlength=\"256\" class=\"frmLoginEdit\"></td>
40 </tr>
41 <tr><td align=\"center\" colspan=2><input type=\"submit\" value=\"Вход\" class=\"frmLoginButton\"></td></tr>
42 <tr><td align=\"center\" colspan=2><p class=\"frmLoginText\"><font size=\"-1\"><a href=\"/register.php\">Зарегистрироваться</a></font></p></td></tr>
43 </table>
44 </form>\n";
45 }
46
47 function putFrmLogout ($name, $lobtn)
48 {
49 $str = query_str_add ($_SERVER['QUERY_STRING'], 'logout');
50 echo "<table bgcolor=\"#FFF0E0\" width=\"700\" align=\"center\">
51 <tr><td align=\"center\"><p class=\"frmLoginText\">Здравствуйте, $name!</p></td></tr>
52 <tr><td align=\"center\">";
53 if ($lobtn)
54 echo "<form action=\"?$str\" method=\"POST\"><input type=\"submit\" value=\"Выход\" class=\"frmLoginButton\"></form>";
55 echo "</td></tr></table>";
56 }
57
58 function t_err ($str)
59 {
60 echo '<p align="center">' . $str . '</p>';
61 exit;
62 }
63
64 function Testing ()
65 {
66 global $result, $QuestionsTable, $ResultsTable, $UsersTable;
67 global $MatrixWidth, $TriesCount, $TimeLimit;
68 global $Domain, $VLoginSession;
69 global $req_cmd, $req_where, $req_display;
70 session_name ($VLoginSession);
71 session_set_cookie_params (-1, '/', '.' . $Domain);
72 @session_start ();
73 $cur_user_id = get_auth_id ();
74 // Выполняем команды начала/конца
75 if (isset ($req_cmd) && $req_cmd == 'start' && !(isset ($_SESSION['TestStarted']) && $_SESSION['TestStarted'] == 1))
76 {
77 // Считываем, сколько ему вообще ещё можно
78 $curuid = get_auth_id ();
79 $result = amysql_query ("SELECT `testlimit` FROM `$UsersTable` WHERE `id`='$curuid' LIMIT 1");
80 if (!$result) t_err ("Внутренняя ошибка");
81 $row = mysql_fetch_row ($result);
82 $testlimit = 1 + $row [0] - 1;
83 if ($testlimit <= 0)
84 t_err ("Попытка взлома!");
85 // Считываем количество вариантов
86 $result = amysql_query ("SELECT MAX(`varid`) FROM `$QuestionsTable`");
87 if (!$result) t_err ("Внутренняя ошибка");
88 $row = mysql_fetch_row ($result);
89 $varcount = 1 + $row[0] - 1;
90 // Рандомим вариант
91 $vr = $_SESSION['TestVar'] = rand (1, $varcount);
92 $_SESSION['TestVarCount'] = $varcount;
93 // Считываем количество вопросов этого варианта
94 $result = amysql_query ("SELECT COUNT(`id`) FROM `$QuestionsTable` WHERE `varid`=$vr");
95 if (!$result) t_err ("Внутренняя ошибка");
96 $row = mysql_fetch_row ($result);
97 $qn = 1 + $row [0] - 1;
98 if ($qn <= 0) t_err ("Неизвестный вариант или БД вопросов пуста.");
99 $_SESSION['TestQCount'] = $qn;
100 // Уменьшаем лимит
101 $result = amysql_query ("UPDATE `$UsersTable` SET `testlimit`=`testlimit`-1 WHERE `id`='$curuid' LIMIT 1");
102 if (!$result) t_err ("Внутренняя ошибка");
103 // Делаем выборку
104 for ($i = 0; $i < $qn; $i++)
105 $flg [$i] = false;
106 for ($i = 0; $i < $qn; $i++)
107 {
108 $rnd = rand (0, $qn-$i-1);
109 for ($j = 0, $r = -1; $j < $rnd+1; $j++)
110 do { $r++; } while ($flg [$r]);
111 $flg [$r] = true;
112 $_SESSION ["TestQ$i"] = $r;
113 $_SESSION ["TestA$i"] = 0; // не отвечено
114 $_SESSION ["TestT$i"] = 0; // количество попыток
115 }
116 $_SESSION['TestStartTime'] = time();
117 $_SESSION['TestStarted'] = 1;
118 $_SESSION['TestCurQ'] = 0;
119 }
120 else if (isset ($_SESSION['TestStarted']) && $_SESSION['TestStarted'] == 1 &&
121 ((isset ($req_cmd) && $req_cmd == 'end') || (isset($TimeLimit) && $TimeLimit > 0 && time () > $_SESSION ['TestStartTime'] + $TimeLimit))) // здесь заложен автовыход по времени
122 {
123 $vr = $_SESSION['TestVar'];
124 $vqn = $_SESSION['TestQCount'];
125 // Сначала выстраиваем "правильный" массив
126 for ($vqi = 0; $vqi < $vqn; $vqi++)
127 $res [$_SESSION["TestQ$vqi"]] = $_SESSION["TestA$vqi"];
128 // И строку для БД
129 $resstr = '';
130 for ($vqi = 0; $vqi < $vqn; $vqi++)
131 $resstr .= $res [$vqi];
132 // Вычисляем количество верных ответов
133 $result = amysql_query ("SELECT * FROM `$QuestionsTable` WHERE `varid`=$vr ORDER BY `num`");
134 if (!$result) t_err ("Внутренняя ошибка");
135 for ($rescount = 0, $vqi = 0; $vqi < $vqn; $vqi++)
136 {
137 $arr = mysql_fetch_assoc ($result);
138 if ($res [-1+$arr['id']] == $arr['rightanswer'])
139 $rescount++;
140 }
141 $respercent = 100 * $rescount / $vqn;
142 // Заносим результаты в БД
143 $curdate = date ("Y-m-d");
144 $curtime = date ("H:i:s");
145 $result = amysql_query ("INSERT INTO `$ResultsTable` SET `id`=DEFAULT, `uid`=$cur_user_id, `varid`=$vr, `date`='$curdate', `time`='$curtime', `answers`='$resstr', `result`=$rescount");
146 if (!$result) t_err ("Внутренняя ошибка");
147 // Убиваем все использованные переменные уровня сессии
148 for ($vqi = 0; $vqi < $vqn; $vqi++)
149 {
150 unset ($_SESSION["TestQ$vqi"]);
151 unset ($_SESSION["TestA$vqi"]);
152 unset ($_SESSION["TestT$vqi"]);
153 }
154 unset ($_SESSION["TestAllA"]);
155 unset ($_SESSION['TestStarted']);
156 unset ($_SESSION['TestCurQ']);
157 unset ($_SESSION['TestQCount']);
158 unset ($_SESSION['TestVar']);
159 unset ($_SESSION['TestVarCount']);
160 // Выводим результат
161 echo '<table bgcolor="#FFF0E0" width="700" cellspacing="1" class="frmLoginText" align="center">';
162 if (isset($TimeLimit) && $TimeLimit > 0 && time () > $_SESSION ['TestStartTime'] + $TimeLimit)
163 echo "<tr><td align=\"center\">Ваше время вышло.</td></tr>";
164 echo "<tr><td align=\"center\">Ваш результат: $rescount = ${respercent}%.</td></tr>";
165 echo '</table>';
166 unset ($_SESSION['TestStartTime']);
167 }
168 // Тестирование уже начато
169 if (isset ($_SESSION['TestStarted']) && $_SESSION['TestStarted'] == 1)
170 {
171 $vr = $_SESSION['TestVar'];
172 $cq = $_SESSION['TestCurQ'];
173 $vqn = $_SESSION['TestQCount'];
174 echo '<table bgcolor="#FFF0E0" width="700" cellspacing="1" class="frmLoginText" align="center">';
175 // Выдаём текущий вариант
176 echo '<tr><td align="center" bgcolor="#E0E0FF" colspan="2">Идёт тестирование';
177 if (isset ($TimeLimit) && $TimeLimit > 0)
178 {
179 $remain = $TimeLimit + $_SESSION['TestStartTime'] - time();
180 $remsec = $remain % 60;
181 $remmin = ($remain / 60) % 60;
182 $remhr = floor ($remain / 3600);
183 if ($remsec < 10) $remsec = '0' . $remsec;
184 if ($remmin < 10) $remmin = '0' . $remmin;
185 if ($remain < 5*60)
186 echo "; <font color=#FF4040><b>ВНИМАНИЕ!</b></font> ";
187 else echo "; ";
188 echo "осталось времени: $remhr:$remmin:$remsec";
189 }
190 if ($_SESSION['TestVarCount'] > 1)
191 echo "; ваш вариант: $vr";
192 echo '</td></tr>';
193 // Выполняем команды, которые работают только в тесте
194 if (isset ($req_cmd))
195 {
196 if ($req_cmd == '1' && $_SESSION["TestA$cq"] != 1 && $_SESSION["TestT$cq"] < $TriesCount)
197 {
198 $_SESSION["TestT$cq"]++;
199 $_SESSION["TestA$cq"] = 1;
200 $ocq = $cq; do { $cq = ($cq+1) % $vqn; } while ($_SESSION["TestA$cq"] != 0 && $cq != $ocq);
201 $_SESSION['TestCurQ'] = $cq;
202 if ($ocq == $cq)
203 $_SESSION["TestAllA"] = 1;
204 }
205 else if ($req_cmd == '2' && $_SESSION["TestA$cq"] != 2 && $_SESSION["TestT$cq"] < $TriesCount)
206 {
207 $_SESSION["TestT$cq"]++;
208 $_SESSION["TestA$cq"] = 2;
209 $ocq = $cq; do { $cq = ($cq+1) % $vqn; } while ($_SESSION["TestA$cq"] != 0 && $cq != $ocq);
210 $_SESSION['TestCurQ'] = $cq;
211 if ($ocq == $cq)
212 $_SESSION["TestAllA"] = 1;
213 }
214 else if ($req_cmd == '3' && $_SESSION["TestA$cq"] != 3 && $_SESSION["TestT$cq"] < $TriesCount)
215 {
216 $_SESSION["TestT$cq"]++;
217 $_SESSION["TestA$cq"] = 3;
218 $ocq = $cq; do { $cq = ($cq+1) % $vqn; } while ($_SESSION["TestA$cq"] != 0 && $cq != $ocq);
219 $_SESSION['TestCurQ'] = $cq;
220 if ($ocq == $cq)
221 $_SESSION["TestAllA"] = 1;
222 }
223 else if ($req_cmd == '4' && $_SESSION["TestA$cq"] != 4 && $_SESSION["TestT$cq"] < $TriesCount)
224 {
225 $_SESSION["TestT$cq"]++;
226 $_SESSION["TestA$cq"] = 4;
227 $ocq = $cq; do { $cq = ($cq+1) % $vqn; } while ($_SESSION["TestA$cq"] != 0 && $cq != $ocq);
228 $_SESSION['TestCurQ'] = $cq;
229 if ($ocq == $cq)
230 $_SESSION["TestAllA"] = 1;
231 }
232 else if ($req_cmd == 'goto')
233 {
234 $_SESSION['TestCurQ'] = $cq = 1 + $req_where - 1;
235 }
236 }
237 // ...и текущий вопрос
238 $bcq = $_SESSION["TestQ$cq"];
239 $result = amysql_query ("SELECT * FROM `$QuestionsTable` WHERE `varid`=$vr ORDER BY `num` LIMIT $bcq, 1");
240 if (!$result) t_err ("Внутренняя ошибка");
241 $arr = mysql_fetch_assoc ($result);
242 $btag1 = $btag2 = $btag3 = $btag4 = $bbtag1 = $bbtag2 = $bbtag3 = $bbtag4 = '';
243 if ($_SESSION["TestA$cq"] == 1) { $btag1 = '<b>'; $bbtag1 = '</b>'; }
244 else if ($_SESSION["TestA$cq"] == 2) { $btag2 = '<b>'; $bbtag2 = '</b>'; }
245 else if ($_SESSION["TestA$cq"] == 3) { $btag3 = '<b>'; $bbtag3 = '</b>'; }
246 else if ($_SESSION["TestA$cq"] == 4) { $btag4 = '<b>'; $bbtag4 = '</b>'; }
247 echo '<tr><td height="5"></td></tr><tr><td style="border: thin solid" align="left" colspan="2"><p style="margin: 5 5 5 5"><b>Вопрос ' . ($cq+1) . ': ' . $arr['question'] . '</b></p></td></tr><tr><td height="5"></td></tr>';
248 echo '<tr><td' . ($_SESSION["TestA$cq"] == 1 ? ' class="selectorGreen"' : ' class="selectorBlue"') . '>' . (($_SESSION["TestT$cq"] < $TriesCount) ? '<a href="/?cmd=1">' : '') . '<p style="margin: 2 2 2 22; text-indent:-19">' . $btag1 . '1. ' . $arr['answer1'] . $bbtag1 . '</p>' . (($_SESSION["TestT$cq"] < $TriesCount) ? '</a>' : '') . '</td></tr>';
249 echo '<tr><td' . ($_SESSION["TestA$cq"] == 2 ? ' class="selectorGreen"' : ' class="selectorOrange"') . '>' . (($_SESSION["TestT$cq"] < $TriesCount) ? '<a href="/?cmd=2">' : '') . '<p style="margin: 2 2 2 22; text-indent:-19">' . $btag2 . '2. ' . $arr['answer2'] . $bbtag2 . '</p>' . (($_SESSION["TestT$cq"] < $TriesCount) ? '</a>' : '') . '</td></tr>';
250 echo '<tr><td' . ($_SESSION["TestA$cq"] == 3 ? ' class="selectorGreen"' : ' class="selectorBlue"') . '>' . (($_SESSION["TestT$cq"] < $TriesCount) ? '<a href="/?cmd=3">' : '') . '<p style="margin: 2 2 2 22; text-indent:-19">' . $btag3 . '3. ' . $arr['answer3'] . $bbtag3 . '</p>' . (($_SESSION["TestT$cq"] < $TriesCount) ? '</a>' : '') . '</td></tr>';
251 echo '<tr><td' . ($_SESSION["TestA$cq"] == 4 ? ' class="selectorGreen"' : ' class="selectorOrange"') . '>' . (($_SESSION["TestT$cq"] < $TriesCount) ? '<a href="/?cmd=4">' : '') . '<p style="margin: 2 2 2 22; text-indent:-19">' . $btag4 . '4. ' . $arr['answer4'] . $bbtag4 . '</p>' . (($_SESSION["TestT$cq"] < $TriesCount) ? '</a>' : '') . '</td></tr>';
252 if (isset ($_SESSION["TestAllA"]) && $_SESSION["TestAllA"]==1)
253 echo '<tr><td bgcolor="#E0E0FF" align="center" colspan="2">Вы ответили на все вопросы.</td></tr>';
254 if ($_SESSION["TestT$cq"] < $TriesCount)
255 echo '<tr><td align="center" colspan="2">Выберите вариант ответа кликом по его номеру.<br>Осталось попыток: ' . ($TriesCount-$_SESSION["TestT$cq"]) . '</td></tr>';
256 else echo '<tr><td align="center" colspan="2"><b>Попытки исчерпаны.</b></td></tr>';
257 if ($_SESSION["TestA$cq"] > 0)
258 echo '<tr><td align="center" colspan="2">Текущий выбранный ответ отмечен <b>полужирным шрифтом</b>.</td></tr>';
259 // ...и строку с выбором вопроса
260 $cqprev = $cq-9; if ($cqprev < 0) $cqprev = 0;
261 $cqnext = $cq+9; if ($cqnext >= $vqn) $cqnext = $vqn-1;
262 echo '<tr><td align="center" colspan="2">';
263 if (isset($req_display) && $req_display == 'list')
264 {
265 echo "<a href=\"?cmd=goto&where=$cqprev\">&lt;&lt;</a> ";
266 $cqs = $cq-4; if ($cqs < 0) $cqs = 0;
267 $cqe = $cq+4; if ($cqe >= $vqn) $cqe = $vqn-1;
268 for ($cqi = $cqs, $cqi1 = $cqs+1; $cqi <= $cqe; $cqi++, $cqi1++)
269 {
270 if ($_SESSION["TestA$cqi"] == 0) echo '<b>';
271 echo "<a href=\"?cmd=goto&where=$cqi\">${cqi1}</a> ";
272 if ($_SESSION["TestA$cqi"] == 0) echo '</b>';
273 }
274 echo "<a href=\"?cmd=goto&where=$cqnext\">&gt;&gt;</a>";
275 }
276 else
277 {
278 echo '<table align="center" class="frmLoginText" bgcolor="#E0E0FF"><tr><td align="center"' . "colspan=$MatrixWidth>";
279 $cqi = $cq; if ($cqi > 0) $cqi--;
280 echo "<a href=\"?cmd=goto&where=$cqi\">&lt;&lt;</a>";
281 $cqi = $cq; if ($cqi < $vqn-1) $cqi++;
282 echo " <a href=\"?cmd=goto&where=$cqi\">&gt;&gt;</a></td></tr>";
283 $MatrixHeight = ($vqn+$MatrixWidth-1)/$MatrixWidth;
284 for ($i = 0, $cqi = 0, $cqi1 = 1; $i < $MatrixHeight; $i++)
285 {
286 echo '<tr>';
287 for ($j = 0; $j < $MatrixWidth && $cqi < $vqn; $j++, $cqi++, $cqi1++)
288 {
289 echo '<td align="center"';
290 if ($cq == $cqi) echo ' style="border: thin solid"';
291 if ($_SESSION["TestA$cqi"] == 0) echo ' bgcolor="#FFFFFF"';
292 echo '>';
293 if ($_SESSION["TestA$cqi"] == 0) echo '<b>';
294 echo "<a href=\"?cmd=goto&where=$cqi\">${cqi1}</a>";
295 if ($_SESSION["TestA$cqi"] == 0) echo '</b>';
296 echo '</td>';
297 }
298 echo '</tr>';
299 }
300 echo '</table>';
301 }
302 echo '</td></tr>';
303 // ...а также кнопочку "закончить тестирование" /она сначала спросит подтверждения/
304 echo '<tr><td valign="center" bgcolor="#E0E0FF" align="center" colspan="2"><form action="?cmd=end" method="POST"><input class="frmLoginButton" name="endtest" type="submit" value="Закончить тестирование"></form></td></tr>';
305 echo '</table>';
306 }
307 else // Или ещё нет...
308 {
309 print_results_info ($cur_user_id);
310 $result = amysql_query ("SELECT `testlimit` FROM `$UsersTable` WHERE `id`='$cur_user_id' LIMIT 1");
311 if (!$result) t_err ("Внутренняя ошибка");
312 $row = mysql_fetch_row ($result);
313 $testlimit = 1 + $row [0] - 1;
314 // ... количество предписанных тестов ...
315 echo '<table style="border-color: black; border-width: 1; border-style: solid" align="center" width="700" class="frmLoginText" bgcolor="#E0E0FF">';
316 echo "<tr><td align=\"center\">Ещё можно пройти тестов: $testlimit</td></tr>";
317 if ($testlimit > 0) // ... и если можно - кнопочку "начать тестирование"
318 echo '<tr><td valign="center" align="center"><form action="?cmd=start" method="POST"><input class="frmLoginButton" name="starttest" type="submit" value="Начать тестирование"></form></td></tr>';
319 echo '</table>';
320 }
321 }
322
323 import_request_variables("gp", "req_");
324 $login_incorrect = false;
325 $display_name = false;
326
327 $refr = false;
328
329 if (isset ($req_logout) && get_auth_id () > -1) // уже вошёл
330 clean_auth ();
331 else if (isset ($req_loginedit) && isset ($req_passedit))
332 {
333 if (!set_auth ($req_loginedit, $req_passedit))
334 $login_incorrect = true;
335 }
336 get_auth_id();
337 ?>
338 <!-- Здесь "заголовок" страницы -->
339
340 <html>
341 <head>
342 <title>Система тестирования слушателей</title>
343 <meta name="GENERATOR" content="VMX">
344 <meta name="description" content="Система тестирования слушателей">
345 <meta http-equiv=Content-Type content="text/html; charset=windows-1251">
346 <link rel="stylesheet" href="styles.css">
347 </head>
348 <body link=#000000 vlink=#000000 alink=#000000>
349 <table cellspacing="5" class="frmLoginText" style="border-color: black; border-width: 1; border-style: solid" width="700" bgcolor="#FFF0E0" align="center" cellspacing="0">
350 <tr><td align="center" style="border-width: 0 0 1 0; border-color: black; border-style: solid"><b><a href="/"><font size="+1" color="#000000">Система тестирования слушателей</font></a></b><br>&nbsp;</td></tr>
351 <tr><td>
352
353 <!-- Здесь скрипт продолжается -->
354
355 <?php
356
357 if (!isset($req_logout) && get_auth_id () > -1) // уже вошёл
358 $display_name = get_auth_displayname();
359 if ($display_name !== false)
360 {
361 putFrmLogout ($display_name, !isset($_SESSION['TestStarted']) && (!isset ($req_cmd) || $req_cmd != 'start') || (isset ($req_cmd) && $req_cmd == 'end'));
362 Testing ();
363 }
364 else putFrmLogin ($login_incorrect);
365
366 mysql_finish ();
367
368 ?>
369
370 <!-- Здесь конец страницы -->
371 </td></tr>
372 <tr><td class="frmLoginText" align="center" style="border-width: 1 0 0 0; border-color: black; border-style: solid">Powered by VMX, 2006</td></tr>
373 </table>
374 </body>
375 </html>
376 <!-- А здесь совсем конец -->