КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Страница вывода тестовСюда приходит POST-запрос с идентификатором теста, от которого много зависит в дальнейшем. Потому что эта страница выводит разные тесты, с помощью полученных данных из POST-запроса сервер выводит нужный тест: $test = $_POST['test']; В основном вывод вопросов и ответов происходит по одному алгоритму, в цикле DO-WHILE, но каждый тест имеет ряд особенностей, поэтому перед выводом теста мы проверяем, какой надо выводить тест, обычной проверкой: if ($test == "1") {}; Рисунок 2.5 - Иллюстрация первого теста
На странице также присутствует счётчик количества посещений страницы, который служит для вывода номера вопроса-ответа: $numb = 1; $numb = $numb + $_POST['numb']; При первом посещении этой страницы, переменная $_POST['numb'] не существует, поэтому переменная $numb остаётся равной 1. После ответа на вопрос отправляется несколько POST-запросов, один из них это номер вопроса, на который отправляется ответ и каждый раз отправляется номер теста, для вывода выбранного теста: echo "<form method=\"post\" action=\"test.php\" id=\"myform\"> <input type=\"hidden\" name=\"numb\" value=\"" . $numb . "\"> <input type=\"hidden\" name=\"test\" value=\"" . $test . "\">"; Вывод вопросов производится при помощи цикла FOR, перед выводом происходит подключение к базе данных и делается выборка из таблицы согласно условиям выбранного теста: $result = mysql_query("SELECT * FROM test_$test WHERE num_question='$numb'",$db); $myrow = mysql_fetch_array($result); Выборка будет сделана из таблицы test_$test, где $test – это номер теста, который пришёл нам с страницы выбора теста. Так как это переменная, то этот алгоритм подходит для вывода любого теста из базы данных. Далее мы опять делаем MySQL-запрос к базе данных, для выяснения количества вопросов в выбранном тесте. Результат этого запроса заносится в переменную $if которая в дальнейшем будет использоваться в качестве условия выполнения вывода вопросов: $result_if = mysql_query("SELECT num_question FROM test_$test ORDER BY num_question DESC",$db); $myrow_if = mysql_fetch_array($result_if); $if = $myrow_if['num_question'] + 1; Переменную $if я намеренно увеличил на 1, так как если в тесте 25 вопросов, то ответ на 25 вопрос придёт когда $numb будет равна 26, если не увеличивать эту переменную на единицу, то когда переменная $if будет равна $numb вывод вопросов тестирования закончится, и попросту 25 вопрос не отобразится. if ($numb < $if){ echo "<form action=\"test.php\" method=\"post\">"; Вывод номера вопроса и теста вопроса: echo "Вопрос: " . $myrow['num_question'] . "<hr>" . $myrow['question_string'] . "<br>"; Так как максимальное количество ответов во всех тестах равно 5, то цикл делает 5 повторений: for ($otv = 1; $otv <= 5; $otv++){ Производим проверку на присутствие текста ответа в переменной $myrow["question_values$otv"], если переменная непустая то выполняется её вывод: if ($myrow["question_values$otv"] <> ''){ В 3м тесте за счёт его индивидуальности производится отличный от других тестов заполнение скрытых полей формы и дополнительный вывод шкалы уверенности в выбранном ответе: Рисунок 2.6 – иллюстрация 3го теста
if ($test == "3"){ $abc_otv = $otv + 223; echo "<label><input name=\"q_" . $myrow['num_question'] . "\" type=\"radio\" value=\"" . chr($abc_otv) . "\">" . $myrow["question_values$otv"] . "</label><br>"; echo "<br>Насколько Вы уверены в своем выборе?<br> <table width=\"100%\" cellspacing=\"2\" cellpadding=\"0\" bgcolor=\"#F0F0F0\" align=\"center\" class=\"TableQuestion\"> <tr> <td align=\"right\">Совершенно</td>"; for ($j = 10 ; $j > 0 ; $j=$j-1){ echo "<td align=\"center\">$j</td>";} echo "<td>Далеко</td></tr> <tr><td align=\"right\">уверен</td>"; for ($k = 10 ; $k > 0 ; $k=$k-1){ echo "<td align=\"center\"><input type=\"radio\" name=\"qs$numb\" value=\"$k\"></td>";} echo "<td>не уверен</td></tr></table><br>"; } Во всех других случаях, если номер выбранного теста отличен от 3го, происходит заполнение скрытых полей формы по одному образцу: Рисунок 2.7 – Иллюстрация 2го теста
else { echo "<label><input name=\"q_" . $myrow['num_question'] . "\" type=\"radio\" value=\"" . $otv . "\">" . $myrow["question_values$otv"] . "</label><br>\r\n"; } } echo "</td></tr></table><br>\r\n\r\n"; echo "<center><input type=\"submit\" name=\"okbutton\" value=\"Следующий\">" . "<input type=\"hidden\" name=\"test\" value=\"" . $test . "\">" . "<input type=\"hidden\" name=\"numb\" value=\"" . $numb . "\">" . "</form></center></table>"; } В ситуации когда переменная $numb становится равной переменной $if, такое происходит когда пользователь ответил на все предложенные вопросы выдаётся сообщение о окончании тестирования: echo " <table border=\"0\" align=\"center\" cellpadding=\"2\" cellspacing=\"2\" width=\"640px\"><tr><td> <center> <p>Тест закончен... <br><a href=\"choice_test.php\">Выбрать другой тест</a><br><a href=\"hiden_php/exit.php\">Выход</a></p> </td></table>"; } } Рисунок 2.8 – Сообщение об оконченном тестировании
Запись выбранных ответов ведётся с каждым обращением к этой странице, на этой странице одновременно выполняется вывод нового вопроса и запись ответа в БД на предыдущий вопрос, который приходит при помощи POST-запроса: $otvet = $numb - 1; $_POST["q_$otvet"] и $_POST["qs$otvet"] Действия записи или обновления данных в базе данных. При первом посещении этой страницы if ($numb == 1) в базу данных делается MySQL запрос, на обновление результатов, а точнее если тестируемый решил повторно пройти тест, то ответы предыдущего прохождения стираются, чтобы не было наложения старых и новых ответов. А если тестируемый первый раз проходит тестирования, этот запрос попросту создаёт новую запись в базе данных: if ($numb == 1) mysql_query("UPDATE test_values SET test_values_$test='' WHERE pid='$pid'",$db); $result_3 = mysql_query("SELECT * FROM test_values WHERE pid='$pid'",$db); $myrow_3 = mysql_fetch_array($result_3); Так как все действия по записи данных в базе данных логичны только на втором обращении к странице ($numb > 1) когда приходит ответ наа ей вопрос, то оператору IF мы пишем такое условие: if ($numb > 1) { Так как записи новых данных по времени прохождения тестирования производится методом дописывания нового ответа к старому, то делается проверка, если в базе данных есть уже запись под этим идентификатором: if ($pid == $myrow_3['pid']) { MySQL запросом мы делаем выборку данных из базы данных ответов: $result_2 = mysql_query("SELECT * FROM test_values WHERE pid='$pid'",$db); Переменной $valSQL присваивается значение ответов на предыдущие вопросы: $valSQL = mysql_fetch_array($result_2); Процедура добавления нового значения ответа на последний вопрос выглядит следующим образом: Сначала проверяется, если идёт обработка 3го теста, то выполняется сценарий записи новых значений с двумя ответами: if ($test == '3') { Переменной $val присваивается значение $valSQL["test_values_$test"] где находятся ответы на предыдущие вопросы, затем приплюсовывается значение $_POST["q_$otvet"] – ответ на вопрос, и приплюсовывается $_POST["qs$otvet"] – ответ который тестируемый выбирает в шкале уверенности: $val = $valSQL["test_values_$test"] . $_POST["q_$otvet"] . $_POST["qs$otvet"] . " "; Далее значение переменной $val записывается в базу данных ответов, в ячейку который соответствует идентификатору тестируемого: $update_value = mysql_query("UPDATE test_values SET test_values_$test='$val' WHERE pid='$pid'",$db); } Для обработки остальных тестов используется другой тип записи, так как в остальных тестах в каждом вопросе только один ответ и нет шкалы уверенности: else Переменной $val присваивается значение ответов на предыдущие вопросы и пристыкуется новый ответ, полученный методом POST из формы: $val = $valSQL["test_values_$test"] . $_POST["q_$otvet"]; Затем новое значение переменной $val записывается в базу данных: $ update_value = mysql_query("UPDATE test_values SET test_values_$test='$val' WHERE pid='$pid'",$db); } Если тестируемый зашёл первый раз для прохождения этого теста, то создаётся новая запись в базе данных, а не её обновление как описано выше: else { Сначала проверяется, если идёт обработка 3го теста, то выполняется сценарий записи новых значений с двумя ответами: if ($test == '3') { Переменной $val присваивается значение $_POST["q_$otvet"] – ответ на вопрос, и приплюсовывается $_POST["qs$otvet"] – ответ который тестируемый выбирает в шкале уверенности: $val = $_POST["q_$otvet"] . $_POST["qs$otvet"] . " "; Далее значение переменной $val записывается в базу данных ответов, в ячейку который соответствует идентификатору тестируемого: $insert_value = mysql_query("INSERT INTO test_values (pid, test_values_$test) VALUES('$pid','$val')",$db); } else { В этом исключении происходит создании записи в базе данных для тестов отличных от 3го, где на каждый вопрос по одному ответу. Переменной $val присваивается значение ответа, который мы получили из формы на предыдущей странице: $val = $_POST["q_$otvet"]; Затем значение этой переменной и идентификатор тестируемого мы записываем в базу данных: $insert = mysql_query("INSERT INTO test_values (pid, test_values_$test) VALUES('$pid','$val')",$db); }}} По окончанию теста, выдаётся табличка с ссылками на выбор другого теста или выход из системы: echo " <table border=\"0\" align=\"center\" cellpadding=\"2\" cellspacing=\"2\" width=\"640px\"><tr><td> <center> <p>Тест закончен... <br><a href=\"choice_test.php\">Выбрать другой тест</a><br><a href=\"hiden_php/exit.php\">Выход</a></p> </td></table>";
2.7 Административная страница отчётов Вход на данную страницу возможен только при вводе пароля, который известен только администратору сайта. При входе на данную страницу проверяется наличие в Сессии PHP ключа: $propusk = $_SESSION['key']; if ($propusk == "12345"){код страницы}; Если в Сессии есть ключ, то выполняется вывод всего содержимого страницы на экран администратору. Если ключ в сессии есть, но он не совпадает, система выводит сообщение о неверном ключе доступа и и выводится форма для повторного заполнения пароля: else { if ($propusk <> ''){ echo "<p>Неверный ключ</p><p>Введите ключ доступа:<form method=\"POST\" action=\"otchet.php\">\r\n<input name=\"key\" type=\"password\" id=\"key\" maxlength=\"8\"><input type=\"submit\" value=\" ok \"></form></p>";} } Если ключ вообще не существует, переменная $propusk и $_SESSION['key'] не существуют, значит пользователь первый раз посетил эту страницу, и система предлагает ввести ключ доступа, который в дальнейшем будет записан в Сессию PHP ($_SESSION['key']) и соответственно будет присвоен переменной $propusk: else{ echo "<p>Введите ключ доступа:<form method=\"POST\" action=\"otchet.php\">\r\n<input name=\"key\" type=\"password\" id=\"key\" maxlength=\"8\"><input type=\"submit\" value=\" ok \"></form></p>; } } Основное назначение этой страницы – создавать текстовые файлы результатов прохождения тестирования пользователями, эти текстовые файлы определённого формата хранятся на сервере, в каталоге, где расположен сайт в папке (otchet_att). На этой странице можно формировать 3 разных вида отчётов: - индивидуальный файл отчёта, в нём будет написана информация только о конкретном тестируемом - файл отчёта по организации, в нём будет выписана информация о прохождении тестирования всеми работниками выбранной организации - полный отчёт, в нём будет выписана информация обо всех пользователях, которые проходили тестирование
2.7.1 Файл отчёта по организации
Рисунок 2.9 – Иллюстрация по созданию отчёта по организации
В самом верхнем блоке страницы, сервер формирует выпадающий список организаций, работники которых проходили тестирование. Для формирования текстового файла необходимо выбрать нужную организацию и нажать кнопку формы «ok». На языке PHP это выглядит так: echo "<p>Отчёт по организации:</p> <form action=\"otchet.php\" method=\"POST\"> <select name=\"org_otch\" id=\"org_otch\">\r\n<option value=\"...\">(Выбрать)</option>"; Выполняем SQL-запрос к базе данных, в результате в переменную $view_org_otchet присваивается наименование организации, в которой тестируемый работает, вся эта информация берётся из таблицы регистрационных данных тестируемых: $org_otchet = mysql_query ("select * from registr"); $view_org_otchet = mysql_fetch_array ($org_otchet); Затем с помошью цикла DO-WHILE перебираем все места работы тестируемых, которые есть в базе данных: do{ В базе данных может содержаться много тестируемых из одной организации, поэтому надо написать алгоритм, чтобы не было повторений наименований организаций в выпадающем списке. Переменная $num_firm++ при первом обращении становится равной 1, и так как это первый проход цикла, то в выпадающий список выписывается самая первая организация: $num_firm++; if ($num_firm == '1') { echo "<option value=\"" . $view_org_otchet['org'] . "\">" . $view_org_otchet['org'] . "</option>"; В массив переменной $firma[1] записывается наименование организации, которая была вписана в выпадающий список, это нужно для дальнейшего сравнения на совпадение: $firma["$num_firm"] = $view_org_otchet['org']; } Этот сценарий начинает работать со второго прохода цикла, и тут уже каждое наименование фирмы, которое пришло из базы данных, нужно проверять на уникальность, чтобы не было в выпадающем списке повторений: else { $nesovpal = 0; Переменная $nesovpal хранит в себе значение несовпадений наименования организации, которая сравнивается в данном проходе цикла. При проверки каждого нового наименования фирмы эта переменная обнуляется. Каждое новое значение наименования фирмы записывается в массив переменной $firma["$num_firm"], для дальнейшего сравнения на уникальность: $firma["$num_firm"] = $view_org_otchet['org']; При помощи цикла FOR мы сравниваем наименование организации которое пришло из базы данных, со всеми предыдущими наименованиями: for ($a = 1; $a < $num_firm; $a++){ Если значение в переменной $view_org_otchet['org'] равно значению переменной $firma[$a] значит что найдено совпадение, и наименование организации которое пришло из базы данных уже выписано в выпадающий список. В этом случае никаких операций не происходит, и программа заканчивает этот проход цикла и начинается следующий, так сравниваются все значения нового наименования и всех значений организаций, которые находятся в массиве переменной $firma[$a]: if ($view_org_otchet['org'] === $firma[$a]) {} Если значения переменных не совпали, значит в данном случае найдено уникальное наименование организации, но перед выводом её в выпадающий список надо ещё сделать одну проверку, программа просто прибавляет на единицу значение переменной $nesovpal: else { $nesovpal++; Если значение переменной $nesovpal равно значению переменной $num_firm – 1, это означает что наименование фирмы точно уникально и его нужно внести в выпадающий список наименований организаций: if ($nesovpal == $num_firm - 1){ echo "<option value=\"" . $view_org_otchet['org'] . "\">" . $view_org_otchet['org'] . "</option>"; }}}}} while ($view_org_otchet = mysql_fetch_array ($org_otchet)); echo "<input type=\"submit\" value=\" ok \"></form></table></form>"; Выше описан только алгоритм создания выпадающего списка организаций, но основной идеей этой страницы является создание текстового файла. Для начала мы проверяем, пришёл POST-запрос из формы выбора организации: if ($_POST['org_otch'] <> ''){ $firma = $_POST['org_otch']; Отчёты хранятся в отдельной папке для удобства, для начала их создания, нужно сменить каталог (по стандарту выставлен каталог, где расположена страница), меняем каталог на "otchet_txt": chdir("otchet_txt"); Делаем выборку из базы данных, выбираются все поля из таблицы регистрационных данных, где поле Работа выбрана организация которая нас интересует: $search_org = mysql_query("select * from registr where org='$firma'"); $view_org = mysql_fetch_array($search_org); Файлы отчёта уникальны, чтобы не было засорения на сервере при создании нового отчёта старый удаляется: unlink("firma.att"); } С помошью цикла DO-WHILE перебираем все записи в базе данных: do { Переменной $pid_view_values присваиваем значение персонального идентификатора тестируемого, это значение участвует в другом запросе к базе данных, в котором берутся данные о прохождении теста пользователем: $pid_view_values = $view_org['pid']; $otveti = mysql_query("SELECT * FROM test_values where pid='$pid_view_values'"); $view_otveti = mysql_fetch_array($otveti); С помощью функции fopen открываем файл firma.att с атрибутом 'a' (Открывает файл только для записи; помещает указатель в конец файла. Если файл не существует - пытается его создать.): $f = fopen("firma.att" , 'a'); Далее функцией fwrite производим запись данных из базы в текстовый файл отчёта: fwrite($f, $shift9 . $view_org["org"] . ", " . $view_org["date"] . $shift0 . "\r\n"); fwrite($f, "1.ФАМ:" . $view_org["name"] . " 2.ИМЯ:" . $view_org["last_name"] . " 3.ОТЧ:" . $view_org["otchestvo"] . " Пол:" . $view_org["sex"] ."\r\n"); fwrite($f, "4.ГОРОД:" . $view_org["place_job"] . "5.ОРГАНИЗАЦИЯ:" . $view_org["org"] . "\r\n"); fwrite($f, "6.ПОДРАЗДЕЛЕНИЕ:" . $view_org["unit"] . " 7.ДОЛЖНОСТЬ:" . $view_org["position"] . "\r\n"); fwrite($f, "8.ГОД РОЖДЕНИЯ:" . $view_org["year"] . " 9.ОБЩ. ТРУД. СТАЖ:" . $view_org["experience"] . " 10.В ДАННОЙ ОРГ-ИИ С:" . $view_org["org_year"] . "\r\n"); fwrite($f, "11.В ЗАНИМАЕМОЙ ДОЛЖНОСТИ С:" . $view_org["position_year"] . " 12.ОБРАЗОВАНИЕ:" . $view_org["education"] . "\r\n"); fwrite($f, "13.В:" . $view_org["educ_year"] . " ГОДУ ЗАКОНЧИЛ:" . $view_org["name_educ"] . "\r\n"); fwrite($f, "14.ПО СПЕЦИАЛЬНОСТИ:" . $view_org["position_educ"] . "\r\n"); fwrite($f, "ТЕЛЕФОН: РАБОЧИЙ " . $view_org["tel_work"] . " ДОМАШНИЙ:" . $view_org["tel_home"] . "\r\n"); fwrite($f, "16.ОСНОВНЫЕ ЦЕЛИ ДЕЯТЕЛЬНОСТИ И РЕШАЕМЫЕ ЗАДАЧИ:" . $view_org["goal"] . "\r\n"); fwrite($f, "РАВЕН:" . $view_otveti["test_values_1"] . "\r\n"); fwrite($f, "ВЕРБАЛЬНЫЙ:" . $view_otveti["test_values_2"] . "\r\n"); fwrite($f, "СИТУАЦИОННЫЙ:" . $view_otveti['test_values_3'] . "\r\n"); fwrite($f, "ПСИХОЛОГИЧЕСКИЙ:\r\n"); В базе данных, в таблице где находятся ответы на 4й тест, ответы написаны непрерывным списком, а для файла отчёта нужно использовать шаблон выписки ответов, поэтому мы разбиваем длинную строку на 4 функцией substr(переменная, начало, длина), и присваиваем их переменным: $otvet_60 = substr($view_otveti['test_values_4'], 1, 60); $otvet_120 = substr($view_otveti['test_values_4'], 61, 60); $otvet_180 = substr($view_otveti['test_values_4'], 121, 60); $otvet_235 = substr($view_otveti['test_values_4'], 181, 55); fwrite($f, "1- 60:" . $otvet_60 . "\r\n"); fwrite($f, "61-120:" . $otvet_120 . "\r\n"); fwrite($f, "121-180:" . $otvet_180 . "\r\n"); fwrite($f, "181-235:" . $otvet_235 . "\r\n\r\n"); fclose($f); } while ($view_org = mysql_fetch_array($search_org)); По окончанию записи в файл выдаётся сообщение, что файл отчёта был создан и ссылка на его скачивание с сервера: echo "<table class=\"TableQuestion\" align=\"center\" width=\"95%\" cellpadding=\"0\"><tr><td> <p>Файл отчёта по организации $firma создан (<a href=\"otchet_txt/firma.att\" target=\"_blank\">firma.att</a>)</p></center> </td></tr></table>"; Рисунок 2.10 - Сообщение о создании отчёта по организации
2.7.2 Индивидуальный файл отчёта
В среднем блоке страницы выводится информация о всех пользователях, которые существуют в базе данных. Информация представлена в таблице, в которой выписаны ФИО тестируемых и отмечены тесты, которые они проходили. В самой последней колонке таблицы присутствует кнопка «Записать в отчёт». При нажатии на эту кнопку на сервер отправляется форма: <input name=\"number_action\" value=\"" . $i . "\" type=\"hidden\">, с командами на выполнение операции по формированию индивидуального отчёта по тестируемому. Значение, которое приходит из формы, с информацией какого именно тестируемого из базы данных записать в файл индивидуального отчёта присваиается пременной $man, далее вся работа будет происходить с этой переменной. $man = $_POST['number_action']; Если администратор нажал на кнопку «Записать в отчёт», то переменная $man будет иметь значение, и будет выполняться условия, в противном случае эта часть кода просто пропускается if ($man <> ' ') {условия} Для записи в внешний файл используются функции fopen() и fwrite(). Для начала опять меняем каталог с стандартного где хранится страница, на каталог созданный специально для таких текстовых файлов отчётов: chdir("otchet_txt"); Делаем выборку из базы данных для конкретного тестируемого: $otveti = mysql_query("SELECT * FROM test_values WHERE pid='$pid_post'"); $view_otveti = mysql_fetch_array($otveti); Функцие открываем текстовый файл индивидуального отчёта (otchet.att) с атрибутом 'w' (Открывает файл только для записи; помещает указатель в начало файла и обрезает файл до нулевой длинны. Если файл не существует - пробует его создать.). Открываем именно с этим атрибутом, так как если есть индивидуальный файл отчёта с данными другого тестируемого, функция с таким атрибутом удаляет всю старую информацию и записывает новую. Таким образом не создаётся много файлов и старая информация удаляется: $f = fopen('otchet.att' , 'w'); Далее записываем все интересующие данные в файл: fwrite($f, $org["$man"] . ", " . $data["$man"] . "\r\n"); fwrite($f, "1.ФАМ:" . $name["$man"] . " 2.ИМЯ:" . $last_name["$man"] . " 3.ОТЧ:" . $otchestvo["$man"] . " Пол:" . $sex["$man"] ."\r\n"); fwrite($f, "4.ГОРОД:" . $place_job["$man"] . "5.ОРГАНИЗАЦИЯ" . $org["$man"] . "\r\n"); fwrite($f, "6.ПОДРАЗДЕЛЕНИЕ:" . $unit["$man"] . " 7.ДОЛЖНОСТЬ:" . $position["$man"] . "\r\n"); fwrite($f, "8.ГОД РОЖДЕНИЯ:" . $year["$man"] . " 9.ОБЩ. ТРУД. СТАЖ:" . $experience["$man"] . " 10.В ДАННОЙ ОРГ-ИИ С:" . $org_year["$man"] . "\r\n"); fwrite($f, "11.В ЗАНИМАЕМОЙ ДОЛЖНОСТИ С:" . $position_year["$man"] . " 12.ОБРАЗОВАНИЕ:" . $education["$man"] . "\r\n"); fwrite($f, "13.В:" . $educ_year["$man"] . " ГОДУ ЗАКОНЧИЛ:" . $name_educ["$man"] . "\r\n"); fwrite($f, "14.ПО СПЕЦИАЛЬНОСТИ:" . $position_educ["$man"] . "\r\n"); fwrite($f, "ТЕЛЕФОН: РАБОЧИЙ " . $tel_work["$man"] . " ДОМАШНИЙ:" . $tel_home["$man"] . "\r\n"); fwrite($f, "16.ОСНОВНЫЕ ЦЕЛИ ДЕЯТЕЛЬНОСТИ И РЕШАЕМЫЕ ЗАДАЧИ:" . $goal["$man"] . "\r\n"); fwrite($f, "РАВЕН:" . $view_otveti["test_values_1"] . "\r\n"); fwrite($f, "ВЕРБАЛЬНЫЙ:" . $view_otveti["test_values_2"] . "\r\n"); fwrite($f, "СИТУАЦИОННЫЙ:" . $view_otveti['test_values_3'] . "\r\n"); fwrite($f, "ПСИХОЛОГИЧЕСКИЙ:\r\n"); В базе данных, в таблице где находятся ответы на 4й тест, ответы написаны непрерывным списком, а для файла отчёта нужно использовать шаблон выписки ответов, поэтому мы разбиваем длинную строку на 4 функцией substr(переменная, начало, длина), и присваиваем их переменным: $otvet_60 = substr($view_otveti['test_values_4'], 1, 60); $otvet_120 = substr($view_otveti['test_values_4'], 61, 60); $otvet_180 = substr($view_otveti['test_values_4'], 121, 60); $otvet_235 = substr($view_otveti['test_values_4'], 181, 55); fwrite($f, "1- 60:" . $otvet_60 . "\r\n"); fwrite($f, "61-120:" . $otvet_120 . "\r\n"); fwrite($f, "121-180:" . $otvet_180 . "\r\n"); fwrite($f, "181-235:" . $otvet_235 . "\r\n"); fclose($f); По окончанию всех действий администратору выдаётся информационный блок, где говорится, что файл создан и даётся ссылка на его скачивание: <center>В файл выборочного отчёта (<a href=\"otchet_txt/otchet.att\" target=\"_blank\">otchet.att</a>) <br>записана информация по тестируемому:<br> " . $name["$man"] . " " . $last_name["$man"] . "</center>
Рисунок 2.11 – Сообщение о создании индивидуального отчёта
2.7.3 Общий отчёт
При формировании таблицы, где отображаются все пользователи, которые проходили тестирование, все данные о пользователях записываются с массивы переменных. Эти переменные используются как для вывода всех пользователей прошедших тестирование на экран, так и для записи данных в отдельный файл отчёта. Если сервер получил POST-запрос с именем 'all_otchet' и значением равным '1', то формируется полный отчёт тестируемых: if ($_POST['all_otchet'] == 1) { Отчёты хранятся в отдельной папке для удобства, для начала их создания, нужно сменить каталог (по стандарту выставлен каталог, где расположена страница), меняем каталог на "otchet_txt": chdir("otchet_txt"); Выполняем запрос к базе данных и берём из неё значения пройденных тестов: $otveti = mysql_query("SELECT * FROM test_values"); Файлы отчёта уникальны, чтобы не было засорения на сервере при создании нового отчёта старый удаляется: unlink("otchet_all.att");} С помощью цикла FOR будем перебирать все пользователей по очереди и дописывать их данные в отчёт: for ($k = 1; $k <= $i; $k++){ Переменной $view_otveti присваиваем значение строки из базы данных: $view_otveti = mysql_fetch_array($otveti); Открываем файл 'otchet_all.att' с атрибутом 'a' (Открывает файл только для записи; помещает указатель в конец файла. Если файл не существует - пытается его создать.): $f = fopen("otchet_all.att" , 'a'); Затем записываем все данные из базы данных в внешний файл полного отчёта: fwrite($f, $shift9 . $org["$k"] . ", " . $data["$k"] . $shift0 . "\r\n"); fwrite($f, "1.ФАМ:" . $name["$k"] . " 2.ИМЯ:" . $last_name["$k"] . " 3.ОТЧ:" . $otchestvo["$k"] . " Пол:" . $sex["$k"] ."\r\n"); fwrite($f, "4.ГОРОД:" . $place_job["$k"] . "5.ОРГАНИЗАЦИЯ" . $org["$k"] . "\r\n"); fwrite($f, "6.ПОДРАЗДЕЛЕНИЕ:" . $unit["$k"] . " 7.ДОЛЖНОСТЬ:" . $position["$k"] . "\r\n"); fwrite($f, "8.ГОД РОЖДЕНИЯ:" . $year["$k"] . " 9.ОБЩ. ТРУД. СТАЖ:" . $experience["$k"] . " 10.В ДАННОЙ ОРГ-ИИ С:" . $org_year["$k"] . "\r\n"); fwrite($f, "11.В ЗАНИМАЕМОЙ ДОЛЖНОСТИ С:" . $position_year["$k"] . " 12.ОБРАЗОВАНИЕ:" . $education["$k"] . "\r\n"); fwrite($f, "13.В:" . $educ_year["$k"] . " ГОДУ ЗАКОНЧИЛ:" . $name_educ["$k"] . "\r\n"); fwrite($f, "14.ПО СПЕЦИАЛЬНОСТИ:" . $position_educ["$k"] . "\r\n"); fwrite($f, "ТЕЛЕФОН: РАБОЧИЙ " . $tel_work["$k"] . " ДОМАШНИЙ:" . $tel_home["$k"] . "\r\n"); fwrite($f, "16.ОСНОВНЫЕ ЦЕЛИ ДЕЯТЕЛЬНОСТИ И РЕШАЕМЫЕ ЗАДАЧИ:" . $goal["$k"] . "\r\n"); fwrite($f, "РАВЕН:" . $view_otveti["test_values_1"] . "\r\n"); fwrite($f, "ВЕРБАЛЬНЫЙ:" . $view_otveti["test_values_2"] . "\r\n"); fwrite($f, "СИТУАЦИОННЫЙ:" . $view_otveti['test_values_3'] . "\r\n"); fwrite($f, "ПСИХОЛОГИЧЕСКИЙ:\r\n"); $otvet_60 = substr($view_otveti['test_values_4'], 1, 60); $otvet_120 = substr($view_otveti['test_values_4'], 61, 60); $otvet_180 = substr($view_otveti['test_values_4'], 121, 60); $otvet_235 = substr($view_otveti['test_values_4'], 181, 55); fwrite($f, "1- 60:" . $otvet_60 . "\r\n"); fwrite($f, "61-120:" . $otvet_120 . "\r\n"); fwrite($f, "121-180:" . $otvet_180 . "\r\n"); fwrite($f, "181-235:" . $otvet_235 . "\r\n"); fclose($f); По завершению всех операций выдаётся информационный блок, где выписано, что всё прошло успешно и даётся ссылка на скачивание отчёта: <center>Файл полного отчёта создан (<a href=\"otchet_txt/otchet_all.att\" target=\"_blank\">otchet_all.att</a>)</center> Рисунок 2.12 – Сообщение о созданном полном отчёте
|