• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

test online - dodawanie odpowiedniej ilości punktów

0 głosów
163 wizyt
pytanie zadane 19 stycznia w PHP przez mn130496 Gaduła (3,640 p.)

Witam 

Chcę stworzyć sobie test online i nie mogę sobie poradzić z następującym problemem. W pytaniach od 1 do 26 chcę aby po wyborze poprawnej odpowiedzi był dodawany 1 pkt , w zadaniach 26 do 31 dodawane 2 pkt , w zadaniach 32 do 33 4 pkt i w 34 zadaniu 5 pkt. Męczę się z tym  i  nie mogę wymyśleć jak rozwiązać ten problem co próbowałem to za każdym razem dodaje  mi zawsze  po 1 pkt. Czy ktoś mógłby mi pomóc w rozwiązaniu tego problemu. Na chwile obecną wymyśliłem coś takiego ale też nie rozwiązuje to mojego problemu. Proszę o pomoc

<?php
    require_once('../function.php');

  //Pobranie odpowiedzi użytkownika
      foreach ($_POST as $p)
      {
        $odpowiedzi[] = $p;
      }

 // PObranie z bazy danych poprawnych odpowiedzi 
  
 $row = get_pytania();

 foreach($row as $r)
 {
  $Poprawne_odp[] = $r['Poprawna']; 
 }

 //Sprawdzenie odpowiedzi i obliczenie wyniku 

 $pkt = 0;

 for ($i=0; $i <count($odpowiedzi) ; $i++) { 
     if ($odpowiedzi[$i] == $Poprawne_odp[$i]) {
        
         $pkt = $pkt + 1;
        
     } 
     elseif ($i >= 25 && $i <= 30 && $odpowiedzi[$i] == $Poprawne_odp[$i])  {
      $pkt = $pkt + 2;
      
     }
     elseif ($i >= 31 && $i <= 32 && $odpowiedzi[$i] == $Poprawne_odp[$i]) {
      $pkt = $pkt + 4;
     }
     elseif( $i == 33 && $odpowiedzi[$i] == $Poprawne_odp[$i])
     {
      $pkt = $pkt + 5;
     }
 }
 $max_pkt = 50; // Maksymalna ilość punktów do uzyskania
 $procent = ($pkt / $max_pkt) * 100;

?>


<!doctype html>
<html lang="pl"> 

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>testy</title>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet"
    integrity="sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB" crossorigin="anonymous">
  <script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@4/tex-mml-chtml.js"></script>
  <style>
    body {
      background: #2F3237;
      ;
    }

    header h1 {
      color: #FA6C65;
      padding-top: 50px;
    }

    header span {
      color: #d2d3d6;
    }

    header p {
      color: #8E9198;
      font-weight: normal;
    }

    #zegar1 {
      ont-family: 'Open Sans', sans-serif;
      font-weight: 400;
      font-size: 20px;
      color: #D2D3D6;
      letter-spacing: 0.025em;
      word-wrap: break-word;
      margin-top: 15px;
      margin-bottom: 15px;
      text-align: center;
      line-height: 150%;
      min-height: 30px;
    }

    .pytania {
      color: #D2D3D6;
    }

    .tresc {
      font-family: 'Open Sans', sans-serif;
      font-weight: 400;
      letter-spacing: 0.025em;
      font-size: 18px;
      padding: 20px;
      line-height: 150%;
      background-color: #26282E;
      text-align: left;
      margin-bottom: 12px;
      margin-top: 50px;
    }

    .odp {
      font-family: 'Open Sans', sans-serif;
      font-weight: 400;
      letter-spacing: 0.025em;
      font-size: 18px;
      padding: 20px;
      line-height: 150%;
      background-color: #26282E;
      text-align: left;
      margin-bottom: 12px;
      margin-top: 20px;
    }

    .math {
      display: inline-block;
      padding: 0px;
      margin: 0px;
      text-align: center;

    }

    input[type=submit] {
      background-color: #FA6C65;
      padding: 5px;
      margin-top: 25px;
      margin-bottom: 25px;
      width: 400px;
      text-align: center;
      font-size: x-large;
      color: white;
      font-weight: bold;
    }
  </style>

</head>

<body>
  <header>
    <div class="container text-center">
      <div class="row">
        <div class="col-12 ">
          <h1>Arkusz Maturalny-<span>Wynik testu</span> </h1>
        </div>
      </div>
      <div class="row">
        <div class="col-12 ">
          <p>Egzamin maturalny został zakonczony. Przeanalizuj popełnione błędy, sporządzaj notatki oraz popracuj nad rzeczmi , które sprawiają ci jeszcze problemy, to najlepszy sposób przygotowania się do prawdziwego egzaminu. Analiza odpowiedzi to etap ważniejszy nawet od samego rozwiązywania testu.
           

          </p>
        </div>
      </div>
      <div class="row">
        <div class="col-md-12" style="border-bottom:1px solid #FA6C65;border-top:1px solid #FA6C65;" data-aos="fade-up">

          <div id="zegar1">Egzamin został 
            <?php
                if ($procent < 30) {
                  echo '<span style= "color:red"> Niezaliczony ';
                } else{
                  echo '<span style= "color:green"> Zaliczony ';
                }
                
                echo '<span style= "color:#FA6C65">Uzyskany wynik:  '.$procent. '%   (' .$pkt. '/'.$max_pkt.')</span>';
            ?> 
          </div>
        </div>
      </div>
  </header>
  <section class="pytania">
    <div class="container">
      <div class="row ">
        <div class="col-6 text-center offset-3">
          <form action="testy.php" method="post">
            <?php
                $rows = get_pytania();
                
                foreach($rows as $r)
                {
                  
                  echo '<div class = "tresc">'.$r['tresc']. '</div>';
                  if ($r['img'] != NULL) {
                    echo '<div class = "obrazek">'.'<img src="../jpg/'.$r['img'].'">'. '</div>';
                  }
                  echo ' <div class="odp">'. '<input type="radio" clase = "odp" name="'.$r['id'].'" value="A">'." A. ".$r['odpA'].'</div>';
                  echo '<div class="odp">'. '<input type="radio" name="'.$r['id'].'" value="B">'." B. ".$r['odpB'].'</div>';
                  echo '<div class="odp">'. '<input type="radio" name="'.$r['id'].'" value="C">'." C.  ".$r['odpC'].'</div>';
                  echo '<div class="odp">'. '<input type="radio" name="'.$r['id'].'" value="D">'." D. ".$r['odpD'].'</div>';

                 
                }
            
            ?>
            
            <div class="row">
              <div class="col-md-12" style="border-bottom:1px solid #FA6C65;border-top:1px solid #FA6C65;"
                data-aos="fade-up">

                <div id="zegar1">Czas jaki pozostał do zakończenia egzaminu → 48 min 22 sek</div>

              </div>
            </div>
            <div class="row offset-2">
              <input type="submit" value="Nowy test">
            </div>


          </form>
        </div>



      </div>
    </div>
  </section>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js"
    integrity="sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI"
    crossorigin="anonymous"></script>
</body>

</html>
komentarz 28 stycznia przez VBService Ekspert (256,600 p.)

BTW, masz w kodzie html powtarzający się id - zegar1

<div id="zegar1">Egzamin został 
   ...            
</div>
<div id="zegar1">Czas jaki pozostał do zakończenia egzaminu → 48 min 22 sek</div>

masz nie podomykane tagi <span>

if ($procent < 30) {
     echo '<span style= "color:red"> Niezaliczony ';
} else{
     echo '<span style= "color:green"> Zaliczony ';
}
komentarz 28 stycznia przez VBService Ekspert (256,600 p.)

AFAIK,

  • W kodzie występuje mieszanie nazw zmiennych w języku polskim i angielskim, np. $odpowiedzi, $Poprawne_odp, $rows, $max_pkt itd., co obniża czytelność i utrudnia dalszy rozwój aplikacji.

  • Nazwy zmiennych nie są spójne pod względem wielkości liter – część zmiennych zaczyna się wielką literą ($Poprawne_odp), a część małą ($odpowiedzi, $pkt), co jest niezgodne z dobrymi praktykami.

  • Stosowane są nieczytelne skróty nazw zmiennych, np. $pkt zamiast bardziej opisowego $punkty lub $wynikPunktowy, co utrudnia zrozumienie kodu osobom trzecim.

  • Brakuje konsekwentnej konwencji nazewnictwa (np. camelCase lub snake_case) dla zmiennych.

  • Nazwy zmiennych nie zawsze jednoznacznie wskazują na swoją funkcję, co zmniejsza przejrzystość logiki programu.

1 odpowiedź

+2 głosów
odpowiedź 19 stycznia przez neo1020 Stary wyjadacz (10,250 p.)
wybrane 24 stycznia przez mn130496
 
Najlepsza

Problem jest w kolejności warunków logicznych 

if ($odpowiedzi[$i] == $Poprawne_odp[$i]) {
    $pkt = $pkt + 1;
}

to wyłapuje każdą poprawną odpowiedź, dlatego żadne else pod spodem się nie wykona i zawsze dostajesz 1pkt

IMO jak używasz bazy danych, dodoaj tam kolumne punkty/points jako int i na tej podstawie licz

po 2, To jest błędne 

foreach ($_POST as $p) {
    $odpowiedzi[] = $p;
}

jeśli user "pominie" pytanie to tablica się rozjedzie i indeksy nie będą pasować do poprawnych odpowiedzi

po 3. Zamiast wpisywać $max_pkt = 50 recznie, oblicz sumę punktów wszystkich pytań pobranych z bazy, wtedy procenty będą liczone nawet gdy dodasz nowe pytanie do db

Podobne pytania

+1 głos
3 odpowiedzi 2,290 wizyt
0 głosów
1 odpowiedź 207 wizyt
pytanie zadane 16 października 2018 w PHP przez niezalogowany
0 głosów
0 odpowiedzi 1,271 wizyt
pytanie zadane 2 listopada 2016 w PHP przez ManiaQ Nowicjusz (210 p.)

93,672 zapytań

142,593 odpowiedzi

323,149 komentarzy

63,199 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...