11.03.2020, 14:16. Показов 567. Ответов 4
Добрый день друзья, пишу систему тестирования, столкнулся с ошибкой: Fatal error: Cannot re-assign auto-global variable _POST in W:\domains\KKOLLEGE\Functions.php on line 78
Вот собственно содержимое файла Functions.php
| PHP |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
| <?php
// Распечатка массива
function print_arr($arr){
echo '<pre>' . print_r($arr, true) . '</pre>';
}
// Получение списка тестов
function get_tests(){
global $db;
$query = "SELECT * FROM test WHERE enable = '1' ";
$res = mysqli_query($db, $query);
if(!$res) return false;
$data = array();
while($row = mysqli_fetch_assoc($res)){
$data[] = $row;
}
return $data;
}
// Получение данных теста
function get_test_data($test_id){
if( !$test_id ) return;
global $db;
$query = "SELECT q.question, q.parent_test, a.id, a.answer, a.parent_question
FROM questions q
LEFT JOIN answers a
ON q.id = a.parent_question
LEFT JOIN test
ON test.id = q.parent_test
WHERE q.parent_test = $test_id AND test.enable = '1' ";
$res = mysqli_query($db, $query);
$data = null;
while ($row = mysqli_fetch_assoc($res)) {
if( !$row['parent_question'] ) return false;
$data[$row['parent_question']][0]= $row['question'];
$data[$row['parent_question']][$row['id']] = $row['answer'];
}
return $data;
}
// Получение id вопрос-ответы
function get_correct_answers($test){
if( !$test ) return false;
global $db;
$query = "SELECT q.id AS question_id, a.id AS answer_id
FROM questions q
LEFT JOIN answers a
ON q.id = a.parent_question
LEFT JOIN test
ON test.id = q.parent_test
WHERE q.parent_test = $test AND a.correct_answer = '1' AND test.enable = '1'";
$res = mysqli_query($db, $query);
$data = null;
while($row = mysqli_fetch_assoc($res)){
$data[$row['question_id']] = $row['answer_id'];
}
return $data;
}
// Строим пагинацию
function pagination($count_questions, $test_data){
$keys = array_keys($test_data);
$pagination = '<div class="pagination">';
for($i = 1; $i <= $count_questions; $i++){
$key = array_shift($keys);
if($i == 1){
$pagination .= '<a class="nav-active" href="#question-' . $key . '">' . $i . '</a>';
}else {
$pagination .= '<a href="#question-' . $key . '">' . $i . '</a>';
}
}
$pagination .= '</div>';
return $pagination;
}
// Итоги
// 1- Массив Вопрос/ответы 2- Правильные ответы 3- Ответы пользователя
function get_test_data_result($test_all_data, $result, $_POST){
// Заполняем массив $test_all_data правильными ответами и данными о неотвеченных вопросах
foreach ($result as $q => $a){
$test_all_data[$q]['correct_answer'] = $a;
// Добавим в массив данные о неотвеченных вопросах
if( !isset($_POST[$q]) ){
$test_all_data[$q]['incorrect_answer'] = 0;
}
}
// Добавим неверный ответ если таковой был
foreach ($_POST as $q => $a) {
// Удалим из $_POST "левые" значения вопросов
if( !isset($test_all_data[$q]) ){
unset($_POST[$q]);
continue;
}
// Если есть "левые" значения ответов
if( !isset($test_all_data[$q][$a]) ){
$test_all_data[$q]['incorrect_answer'] = 0;
continue;
}
// Добавляем неверный ответ
if( $test_all_data[$q]['correct_answer'] != $a ){
$test_all_data[$q]['incorrect_answer'] = $a;
}
}
return $test_all_data;
}
// Печать результатов
function print_result($test_all_data_result){
// Переменные результатов
$all_count = count($test_all_data_result); // количество вопросов
$correct_answer_count = 0; // количество верных ответов
$incorrect_answer_count = 0; // количество неверных ответов
$percent = 0; // процент верных ответов
// Подсчёт результатов
foreach ($test_all_data_result as $item) {
if( isset($item['incorrect_answer']) ) $incorrect_answer_count++;
}
$correct_answer_count = $all_count - $incorrect_answer_count;
$percent = round ( ($correct_answer_count / $all_count * 100), 2);
// вывод результатов
$print_res = '<div class="questions">';
$print_res .= '<div class="count-res">';
$print_res .= "<p>Всего вопросов: <b>{$all_count}</b></p>";
$print_res .= "<p>Из них отвечено верно: <b>{$correct_answer_count}</b></p>";
$print_res .= "<p>Из них отвечено неверно: <b>{$incorrect_answer_count}</b></p>";
$print_res .= "<p>% верных ответов: <b>{$percent}</b></p>";
$print_res .= '</div>';
$print_res .= '</div>';
return $print_res;
}
?> |
|
Вот содержимое файла Tests.php
| PHP |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
| <?php
ini_set("display_errors", 1);
error_reporting(-1);
require_once "db.php"; // подключение к базе данных для регистрации, авторизации через RedBeanPHP
require_once "functions.php"; // подключение файл с функциями
require_once "bdfortests.php"; // Подключение базы данных для вывода тетсов
if( isset($_POST['test']) ){
$test = (int)$_POST['test'];
unset($_POST['test']);
$result = get_correct_answers($test);
if( !is_array($result) ) exit('Ошибка');
// Данные теста
$test_all_data = get_test_data($test);
// 1- Массив Вопрос/ответы 2- Правильные ответы 3- Ответы пользователя
$test_all_data_result = get_test_data_result($test_all_data, $result,$_POST);
// print_r($_POST);
// print_r($result);
// print_r($test_all_data_result);
echo print_result($test_all_data_result);
die;
}
?>
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="=ie=edge">
<link rel="stylesheet" type="text/css" href="css/Login.css">
<link rel="stylesheet" type="text/css" href="css/test.css"> <!-- Стили для тестов -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<title>Тесты ЧУ ККК</title>
</head>
<body>
<?php
require "blocks/TestHeader.php"; // Подключаем Head файл
// Получение списока тестов
$tests = get_tests();
if( isset($_GET['test']) ){
$test_id = (int)$_GET['test'];
$test_data = get_test_data($test_id);
if ( is_array($test_data) ){
$count_questions = count($test_data);
$pagination = pagination($count_questions, $test_data);
}
}
?>
<!-- Вывод тестов на страницу -->
<div class="wrap">
<?php if( $tests ): ?>
<h3 class="my-0 mr-md-auto font-weight-normal">Варианты тестов</h3>
<?php foreach($tests as $test): ?>
<p><a class="btn btn-outline-primary" href="?test=<?=$test['id']?>"><?=$test['test_name']?></a></p>
<?php endforeach; ?>
<!-- Если тест есть и на него нажали, тогда будем выводить -->
<br><hr><br>
<div class="content">
<?php if( isset($test_data) ): ?>
<p>Всего вопросов: <?=$count_questions?></p>
<?=$pagination?>
<span class="none" id="test-id"><?=$test_id?></span>
<!-- Получаем каждый конкретный вопрос + ответы -->
<div class= "test-data">
<h6 class="my-0 mr-md-auto font-weight-normal">Вывод вопросов и ответов</h6>
<?php foreach($test_data as $id_question => $item): ?>
<div class="question" data-id="<?=$id_question?>" id="question-<?=$id_question?>">
<?php foreach($item as $id_answer => $answer): // проходимся по массиву вопрос-ответы ?>
<?php if( !$id_answer ): // выводим вопрос ?>
<p class="q"><?=$answer?></p>
<?php else: // выводим варианты ответов ?>
<p class="a">
<input type="radio" id="answer-<?=id_answer?>" name="question-<?=$id_question?>" value="<?=id_answer?>">
<label for="answer-<?=id_answer?>"><?=$answer?></label>
</p>
<?php endif; // $id_answer ?>
<?php endforeach; //$item ?>
</div> <!-- .question -->
<?php endforeach; // $test_data ?>
</div> <!-- .test-data -->
<div class="buttons">
<button class="center btm" id="btn">Закончить тест</button>
</div>
<?php else: // isset($test_data) ?>
<h6 class="my-0 mr-md-auto font-weight-normal">Выберите тест</h6>
<?php endif; //isset($test_data) ?>
</div> <!-- .content -->
<?php else: // $tests ?>
<h3 class="my-0 mr-md-auto font-weight-normal">Нет тестов</h3>
<?php endif; // $tests ?>
</div> <!-- стиль .wrap -->
<!-- Подключаем библиотеку jquery и java скрипты -->
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script src="js/scripts.js"></script>
</body>
</html> |
|
Если я просто убираю $_POST то всё работает, однако POST собирает Ответы пользователя и в итоге если я закончу тест, то у меня не идёт подсчёт правильных ответов и процент верных ответов