За последние 24 часа нас посетили 10329 программистов и 1127 роботов. Сейчас ищут 189 программистов ...

Объединить ссылки на тесты в одну общую категорию

Тема в разделе "PHP для новичков", создана пользователем Яна Литвинова, 23 июн 2022.

  1. Яна Литвинова

    Яна Литвинова Новичок

    С нами с:
    12 июн 2022
    Сообщения:
    22
    Симпатии:
    0
    Добрый день. Есть форма со списком названий тестов. Подскажите пожалуйста, как лучше объединить их в один общий тест и чтобы в нем они открывались друг за другом без вывода промежуточных результатов? Чтобы после нажатия кнопки "Завершить" подсчитывались результаты по всем категориям, с сохранением в БД. Но пользователю не показывались эти результаты. Спасибо за помощь.
    Код (Text):
    1. <?php
    2.     include_once  'db.php';
    3.  
    4.     $do = trim(strip_tags($_GET['do']));
    5.     if ($do == 'save') {
    6.         $title = trim($_POST['title']);
    7.  
    8.         $res = $db->prepare("INSERT IGNORE INTO tests (`title`) VALUES (:title)");
    9.         $res->execute([
    10.             ':title' => $title,
    11.         ]);
    12.         $testId = $db->lastInsertId();
    13.  
    14.         $questionNum = 1;
    15.         while (isset($_POST['question_' . $questionNum])) {
    16.             $question = trim($_POST['question_' . $questionNum]);
    17.             if (empty($question)) {
    18.                 continue;
    19.             }
    20.  
    21.             $res = $db->prepare("INSERT IGNORE INTO questions (`test_id`, `question`) VALUES (:test_id, :question)");
    22.             $res->execute([
    23.                 ':test_id' => $testId,
    24.                 ':question' => $question,
    25.             ]);
    26.             $questionId = $db->lastInsertId();
    27.  
    28.             $answerNum = 1;
    29.             while (isset($_POST['answer_text_' . $questionNum . '_' . $answerNum])) {
    30.                 $answer = trim($_POST['answer_text_' . $questionNum . '_' . $answerNum]);
    31.                 $score = trim($_POST['answer_score_' . $questionNum . '_' . $answerNum]);
    32.                 if (empty($answer)) {
    33.                     continue;
    34.                 }
    35.  
    36.                 $res = $db->prepare("INSERT IGNORE INTO answers (`question_id`, `answer`, `score`)
    37.                                     VALUES (:question_id, :answer, :score)");
    38.                 $res->execute([
    39.                     ':question_id' => $questionId,
    40.                     ':answer' => $answer,
    41.                     ':score' => $score,
    42.                 ]);
    43.  
    44.                 $answerNum++;
    45.             }
    46.             $questionNum++;
    47.         }
    48.  
    49.         $resultNum = 1;
    50.         while (isset($_POST['result_' . $resultNum])) {
    51.             $result = trim($_POST['result_' . $resultNum]);
    52.             $scoreMin = trim($_POST['result_score_min_' . $resultNum]);
    53.             $scoreMax = trim($_POST['result_score_max_' . $resultNum]);
    54.  
    55.             $res = $db->prepare("INSERT IGNORE INTO results (`test_id`, `score_min`, `score_max`, `result`)
    56.                                     VALUES (:test_id, :score_min, :score_max, :result)");
    57.             $res->execute([
    58.                 ':test_id' => $testId,
    59.                 ':score_min' => $scoreMin,
    60.                 ':score_max' => $scoreMax,
    61.                 ':result' => $result,
    62.             ]);
    63.  
    64.             $resultNum++;
    65.         }
    66.  
    67.         header ('Location: admin.php?do=list');
    68.     }
    69.  
    70.     if ($do != 'add') {
    71.         $do = 'list';
    72.     }
    73. ?>
    74.  
    75. <!doctype html>
    76. <html lang="ru">
    77. <head>
    78.     <meta charset="UTF-8">
    79.     <meta name="viewport"
    80.           content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    81.     <meta http-equiv="X-UA-Compatible" content="ie=edge">
    82.     <title>Система тестирования</title>
    83.     <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
    84.     <link rel="stylesheet" href="css/app.css">
    85. </head>
    86. <body>
    87.  
    88.     <div class="container">
    89.         <div class="row justify-content-center">
    90.  
    91.             <?php include_once 'inc/' . $do . '.php'; ?>
    92.  
    93.  
    94.         </div>
    95.     </div>
    96.  
    97.     <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
    98.     <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    99.     <script src="js/app.js"></script>
    100. </body>
    101. </html>
     
  2. antoniii

    antoniii Новичок

    С нами с:
    16 мар 2022
    Сообщения:
    155
    Симпатии:
    18
    Надо прояснить логику работы приложения. Как названия тестов попадают на страницу? Из примера можно догадаться, как данные записываются в базу данных. Нужно нарисовать себе схему начиная с загрузки главной страницы и действий пользователя. Проследить путь передачи данных. Решение придет само.
     
  3. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.370
    Симпатии:
    554
    Просто по всем вопросам сделайте перемещение (с сортировкой в первую очередь по тесту, особенно если вопросы идут «вразнобой»). При переходе на новый тест, если нужно, сохраняйте результаты предыдущего. Для этого нужно хранить в сессии id тек. теста. Чтобы нельзя было открыть произвольный вопрос, храните в сессии и id тек. или след. вопроса (понятно, что при хранении id вопроса id теста в общем-то можно не хранить). В итоге можно сделать даже вывод всех вопросов по одному адресу.
    --- Добавлено ---
    Я бы, наверное, хранил в БД ответ пользователя на каждый вопрос и не давал его перезаписывать (пока админ не положит этот ответ в «архив»). Можно просто перед тестированием пользователей создавать новый объект «тестирование» и не давать пользователям повторно отвечать на вопросы одного и того же тестирования.
     
    #3 miketomlin, 23 июн 2022
    Последнее редактирование: 23 июн 2022
  4. antoniii

    antoniii Новичок

    С нами с:
    16 мар 2022
    Сообщения:
    155
    Симпатии:
    18
    @Яна Литвинова попробуйте использовать в коде комментарии для себя. Объясняйте себе, что делает этот участок кода. Тогда проще будет понять, как и что работает. Для неизвестной функции можно использовать поиск, где прочитать назначение.