@YTGoodFox

Cannot re-assign auto-global variable _POST in?

Добрый день друзья, пишу систему тестирования, столкнулся с ошибкой: Fatal error: Cannot re-assign auto-global variable _POST in W:\domains\KKOLLEGE\Functions.php on line 78
Вот собственно содержимое файла Functions.php
<?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
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 собирает Ответы пользователя и в итоге если я закончу тест, то у меня не идёт подсчёт правильных ответов и процент верных ответов
  • Вопрос задан
  • 584 просмотра
Решения вопроса 1
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Назовите переменную любым другим именем, отсутствующем в списке предопределённых переменных языка PHP. Соответственно и внутри самих функций эти переменные нужно поменять на новое имя...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Melkij
@Melkij
PostgreSQL DBA
function foo ($_POST) {}
PHP Fatal error: Cannot re-assign auto-global variable _POST in php shell code on line 1

Вы не можете назвать (в частности) параметр функции именем автоматической глобальной переменной.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы