Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [JavaScript][PHP]test z ograniczoną ilością czasu
blade-mrn
post
Post #1





Grupa: Zarejestrowani
Postów: 113
Pomógł: 11
Dołączył: 20.10.2009

Ostrzeżenie: (0%)
-----


Jestem tu nowy więc Witam wszystkich i do rzeczy.
Piszę właśnie stronę na której będzie można przeprowadzać testy i stanąłem w jednym miejscu, mianowicie na rozwiązanie każdego testu jest określona ilość czasu i nie było by tu dużego problemu gdyby nie fakt iż pytania są wyświetlane pojedynczo (stronicowanie) i po każdej udzielonej odpowiedzi skrypt jest przekierowywany do innego pliku gdzie następuje zapis udzielonej odpowiedzi do bazy MySql oraz inkrementacja zmiennych stronicowania i na końcu przekierowanie z powrotem. Mój problem polega na tym, że początkowo użyłem JS do odliczania czasu i przekierowania na stronę z wynikiem gdy on upłynie ale po wprowadzeniu opisanego powyżej rozwiązania to się nie sprawdza bo JS po każdym odświeżeniu strony zaczyna odliczanie od początku. Myślałem nad zapisem aktualnego czasu do zmiennej w sesji przed przekierowanie a potem ponowne jej odczytanie tyle, że nie wiem jak to można zrobić :/ Czy ktoś mi podsunie rozwiązanie tego problemu, a może ktoś ma lepszy pomysł (IMG:style_emoticons/default/questionmark.gif)
Poniżej przedstawiam kod źródłowy wspomnianych wcześniej plików.
Plik wyświetlający test:
  1. <?php
  2. @$db = new mysqli ($db_host, $db_user, $db_pass, $db_name);
  3. if (mysqli_connect_errno()) {echo 'Błąd połączenia z bazą!'; exit;}
  4. $zap_test = $db->query("SELECT * FROM testy WHERE id_test=".$id_test);
  5. $rek_test = $zap_test->fetch_assoc();
  6. for ($i=0;$i<=strlen($rek_test['czas']);$i++)
  7. {
  8. if ($i<2) {$godz = $godz.$rek_test['czas'][$i];}
  9. if (($i>2) && ($i<5)) {$min = $min.$rek_test['czas'][$i];}
  10. if ($i>5) {$sek = $sek.$rek_test['czas'][$i];}
  11. }
  12. if (($godz == 0) && ($min == 0) && ($sek == 0))
  13. { echo 'Brak limitu czasu.';}
  14. else
  15. {
  16. echo 'Pozostało Ci <span id="sekundy" style="font-size: 20px"></span> sekund. ';
  17. echo $godz.'h '.$min.' min '.$sek;
  18. }
  19. if (is_numeric($_REQUEST['page']))
  20. {
  21. $page = (int) $_REQUEST['page'];
  22. if ($page < 1) { $page = 1; }
  23. }
  24. else { $page = 1; }
  25. $start = ($page - 1);
  26. $_SESSION['page'] = $page;
  27. $zap_ile_pyt = $db->query("SELECT * FROM pytania WHERE id_test=".$rek_test['id_test']);
  28. $result = $db->query("SELECT * FROM pytania WHERE id_test = ".$rek_test['id_test']." LIMIT $start, 1");
  29. echo '<form action="index.php?id=7" method="POST" id="form">';
  30. echo '<ol type="I">';
  31. for ($i=1;$i<=$result->num_rows;$i++)
  32. {
  33. $rek_pyt = $result->fetch_assoc();
  34. echo '<input type="hidden" name="id_pyt" value="'.$rek_pyt['id_pytania'].'">';
  35. echo $rek_pyt['pytanie'].'<br />';
  36. $zap_odp = $db->query("SELECT * FROM odpowiedzi WHERE id_test=".$rek_test['id_test']." AND id_pyt=".$rek_pyt['id_pytania']);
  37. echo '<ol>';
  38. for ($j=1; $j<=$zap_odp->num_rows; $j++)
  39. {
  40. $rek_odp = $zap_odp->fetch_assoc();
  41. echo '<li>'.$rek_odp['odpowiedz'].'<input type="checkbox" name=checkodp'.$j.'></li>';
  42. }
  43. echo '</ol>';
  44. }
  45. echo '<input type="submit" value="dalej">';
  46. echo "<br /><a href='index.php?id=0'>Wróć</a></div>";
  47. echo '</form>';
  48. ?>
  49. <script type="text/javascript">
  50. o=document.getElementById('sekundy')
  51. function odliczaj(o,sek)
  52. {
  53. o.innerHTML=sek
  54. if(sek>0)setTimeout(function(){odliczaj(o,--sek)},1e3)
  55. if(sek==0){window.location ="index.php?id=6";}
  56. }
  57. odliczaj(document.getElementById('sekundy'),<?php echo ($godz*60*60)+($min*60)+$sek; ?>)
  58. </script>
  59. </body>
  60. </html>

Plik dokonujący zapisu i inkrementacji:
  1. <?php
  2. require_once ('common.php');
  3. $id_test = $_SESSION['ide'];
  4. $nr_ucznia = $_SESSION['nr_ucznia'];
  5. $klasa = $_SESSION['klasa'];
  6. $id_pyt = $_POST['id_pyt'];
  7. date_default_timezone_set ("Europe/Warsaw");
  8. $data = date('Ymd');
  9. $czas = date('His');
  10. $ip = getenv('REMOTE_ADDR');
  11. @$db = new mysqli ($db_host, $db_user, $db_pass, $db_name);
  12. if (mysqli_connect_errno()) {echo 'Błąd połączenia z bazą!'; exit;}
  13. $zap_odp = $db->query("SELECT * FROM odpowiedzi WHERE id_test=".$id_test." AND id_pyt=".$id_pyt);
  14. for ($j=1; $j<=$zap_odp->num_rows; $j++)
  15. {
  16. $rek_odp = $zap_odp->fetch_assoc();
  17. if ($_POST['checkodp'.$j] == on)
  18. {
  19. $zap_roz = $db->query("INSERT INTO roz VALUES (NULL,'".strtoupper($klasa)."',".$nr_ucznia.",".$id_test.",".$rek_odp['id_odp'].",".$data.",".$czas.",'".$ip."'".")");
  20. }
  21. }
  22. //----------------START Zmiana strony w stronicowaniu---------------
  23. $next = $_SESSION['next'];
  24. $next = $_SESSION['page'] + 1;
  25. $_SESSION['next'] = $next;
  26. $zap_ile_pyt = $db->query("SELECT id_pytania FROM pytania WHERE id_test=".$id_test);
  27. if ($next <= $zap_ile_pyt->num_rows)
  28. {
  29. echo '<META HTTP-EQUIV="Refresh" CONTENT="0;URL='.$_SERVER['PHP_SELF'].'?id=5&page='.$next.'">';
  30. }
  31. else
  32. {
  33. echo '<META HTTP-EQUIV="Refresh" CONTENT="0;URL=index.php?id=6">';
  34. }
  35. //-------------STOP zmiana strony w stronicowaniu-------------------
  36. ?>

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Myślę, że drugi przykład stąd (http://www.w3schools.com/js/js_timing.asp) Cię naprowadzi na rozwiązanie (IMG:style_emoticons/default/winksmiley.jpg) Tutaj leci w górę od 0... Ty zrobisz to samo, ale w dół. Gdy dojdzie do 0 -> przekierowanie (IMG:style_emoticons/default/smile.gif) Zerknij sobie tam a zauważysz, że całość metody jest banalna. Tylko sobie dopasuj do potrzeb ten prosty kod.

EDIT:
Przykładowo masz czas_startu testu i wiesz, że trwać on ma 5 minut (czas_testu) w sumie na 10 pytań, ale maksymalnie jest minuta na pytanie. Robisz więc na każdej stronie counter odliczający w dół od 60 (limit na pytanie). Masz też czas startu testu. Liczysz więc:
czas_testu + czas_startu - czas_obecny_w_chwili_startu_pytania
lub inaczej:
czas_testu - ( czas_obecny_w_chwili_startu_pytania - czas_zapisany)
co da nam czas jaki pozostaje na całość testu. Oba te liczniki sobie lecą w dół i dojście do 0 któregoś z nich wywołuje odpowiednie zdarzenie (albo nowe pytanie, albo koniec testu). Chyba prosto to opisałem?

Ten post edytował thek 21.10.2009, 13:40:36
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 13.10.2025 - 18:58