2017-12-19 1 views
3

나는 PHP로 온라인 퀴즈 웹 사이트를 개발 중이다. 나는 그것을 한 번 해봤습니다. 질문은 데이터베이스에서 하나씩 무작위로 선택되었습니다. 다음과 같은 PHP 파일이 있습니다 :php에서 카운트 다운 타이머를 구현하는 방법

database.php, login.php, logout.php, quiz .php, result.php.

  • 사용자 로그인이, 그는, 인덱스 페이지 (홈페이지) 퀴즈 및 결과를 포함로 리디렉션 줘야 할 때
  • 는 사용자 선택 퀴즈 그는 어디 그가 할 수있는 quiz.php로 리디렉션 줘야 할 때 퀴즈 달기
  • 나중에 사용자가 마침을 클릭하면 사용자가 수있는 홈 페이지로 리디렉션됩니다.이 결과는 정상적으로 작동합니다.

이제 사용자가 퀴즈를 풀고있는 동안 지속적으로 표시되는 카운트 다운 타이머를 첨부하고 싶습니다 (분 및 초 남음 사용).

타이머가 만료되면 (0에 도달) 퀴즈 .php은 공백으로 표시되어야하며 사용자가 결과를 볼 수있는 홈 페이지로 리디렉션되어야합니다.

다음과 같은 카운트 다운 타이머 코드가 있지만이를 구현하는 방법을 얻지 못하고 있습니다. 구현 방법이 도움이 될 수 있습니다.

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
    <script language ="javascript" > 
     var tim; 

     var min = 20; 
     var sec = 60; 
     var f = new Date(); 
     function f1() { 
      f2(); 
      document.getElementById("starttime").innerHTML = "Your started your Exam at " + f.getHours() + ":" + f.getMinutes(); 


     } 
     function f2() { 
      if (parseInt(sec) > 0) { 
       sec = parseInt(sec) - 1; 
       document.getElementById("showtime").innerHTML = "Your Left Time is :"+min+" Minutes ," + sec+" Seconds"; 
       tim = setTimeout("f2()", 1000); 
      } 
      else { 
       if (parseInt(sec) == 0) { 
        min = parseInt(min) - 1; 
        if (parseInt(min) == 0) { 
         clearTimeout(tim); 
         location.href = "default5.aspx"; 
        } 
        else { 
         sec = 60; 
         document.getElementById("showtime").innerHTML = "Your Left Time is :" + min + " Minutes ," + sec + " Seconds"; 
         tim = setTimeout("f2()", 1000); 
        } 
       } 

      } 
     } 
    </script> 
</head> 
<body onload="f1()" > 
    <form id="form1" runat="server"> 
    <div> 
     <table width="100%" align="center"> 
     <tr> 
      <td colspan="2"> 
      <h2>This is head part for showing timer and all other details</h2> 
      </td> 
     </tr> 
     <tr> 
      <td> 
      <div id="starttime"></div><br /> 
      <div id="endtime"></div><br /> 
      <div id="showtime"></div> 
      </td> 
     </tr> 
     <tr> 
      <td> 

       <br /> 


      </td> 

     </tr> 
     </table> 
     <br /> 


    </div> 
    </form> 
</body> 
</html> 
+1

사용자가 퀴즈를 시작하면 데이터베이스에 datetime을 기록합니까? – RamRaider

+0

아니, 데이터베이스에 기록하지 않고 있습니다. 카운트 다운 타이머가 필요합니다. 시간이 끝나면 퀴즈가 중지됩니다. –

+0

질문은'php에서 카운트 다운 타이머를 구현하는 법'이라고 말하지만 모든 코드는 자바 스크립트입니다. 시작 시간을 기록하지 않으면 사용자가 페이지를 다시로드하는 것을 멈추고 타이머가 다시 시작됩니다. – RamRaider

답변

1

WebSocket 또는 연결을 유지할 다른 것을 사용하고 싶지 않으면 PHP로 타이머를 만들 필요가 없습니다. 당신은 (어떤 당신이 그것을 부분적으로 구현 한) 필요가있는 것입니다 :

1 - 자바 스크립트 타이머,

var maxTime = 50000; // time in milliseconds 
setTimeout(postFormFunction, maxTime) 

2 - Autopost

function postFormFunction() { 
    getElementById('form1').submit(); 
} 

3 - 그리고 마지막으로,하지만 가장 중요한 (실제 앱의 경우) 사용자가 속임수를 쓰지 않도록하기 위해 양식이 작성된 시간을 저장하고 게시 된 시간을 확인해야합니다. 만료 된 사용자가 JS 시간 초과를 중지하고 무제한 시간이 걸릴 수 있기 때문입니다 확인하지 않으면.

앱의 디자인 방식, DB에 저장하거나 토큰을 사용하거나 하드 드라이브에 데이터를 저장하기 때문에 코드를 제공하지 않겠습니다.) 실제 응용 프로그램에 대한 시간이 올 때 내 길을 찾으십시오.)

+0

아마도 누군가가 타이머를 다시 시작하기 위해 페이지를 다시로드하지 않기 위해 일부 서버 측 코드가 필요합니다. –

+0

@NicoHaase, 너무 광범위하고 적어도 DB를 알아야하기 때문에 서버 솔루션을 작성하려고하지 않았습니다. 스키마를 예로들 수 있으며 DB에 필요하지 않을 수도 있습니다. 서명 된 토큰 JWT를 페이로드에 설정된 시간 초과와 함께 사용할 수 있습니다. – 2oppin

0

데이터베이스에 시작 시간을 저장하지 않으면 세션을 사용하여 동일한 작업을 더 많거나 적게 수행 할 수 있습니다. 아래의 코드는 카운트 다운을 호출하지만 ~이있는 실제 코드에 맞게 수정해야하지만 결과를 보려면 "있는 그대로"실행 해보십시오. 세션이 유지되고, 따라서 페이지 사이를 유지 카운트 다운이 내가 함께 여러 페이지를 에뮬레이트하는 작은 단일 페이지 데모를 넣어 당신을 설득하기위한 노력의 일환으로

<?php 
    session_start(); 

    /* quiz.php */ 
    if(empty($_SESSION['quiz']))$_SESSION['quiz']=date('Y-m-d H:i:s'); 
?> 
<!doctype html> 
<html> 
    <head> 
     <meta charset='utf-8' /> 
     <title>Quiz countdown</title> 
     <script> 
      <?php 
       $start=$_SESSION['quiz']; 
       $end=date('Y-m-d H:i:s', strtotime($_SESSION['quiz'] . ' +20 minutes')); 
       echo " 
        var date_quiz_start='$start'; 
        var date_quiz_end='$end'; 
        var time_quiz_end=new Date('$end').getTime();"; 
      ?> 

      document.addEventListener('DOMContentLoaded', function(){ 
       (function(time){ 
        var now=new Date().getTime(); 

        var difference = time_quiz_end - now; 

        var days = Math.floor(difference/(1000 * 60 * 60 * 24)); 
        var hours = Math.floor((difference % (1000 * 60 * 60 * 24))/(1000 * 60 * 60)); 
        var minutes = Math.floor((difference % (1000 * 60 * 60))/(1000 * 60)); 
        var seconds = Math.floor((difference % (1000 * 60))/1000); 



        t=setTimeout(arguments.callee, time); 

        if(difference <= 0){ 
         clearTimeout(t); 
         alert('GAME OVER'); 
         /* redirect user, display message, stand on one leg or whatever you need to do - quiz has finished */ 
         return false; 
        } 
        document.getElementById("starttime").innerHTML=date_quiz_start; 
        document.getElementById("endtime").innerHTML=date_quiz_end; 
        document.getElementById("showtime").innerHTML = days + "d " + hours + "h " + minutes + "m " + seconds + "s "; 
       })(1000); 
      },false); 
     </script> 
    </head> 
    <body> 
     <div id='starttime'></div> 
     <br /> 
     <div id='endtime'></div> 
     <br /> 
     <div id='showtime'></div> 
    </body> 
</html> 

. 단순화를 위해 3 개의 파일이 있습니다.

메인 페이지 ~ 나는 so-quiz.php라고 불렀다하지만 이름은 중요하지 않다

<?php 
    session_start(); 
    include 'quiz.inc'; // see below 
?> 
<html> 
    <head> 
     <meta charset='utf-8' /> 
     <title>Quiz experiments</title> 
     <script> 
      <?php 
       $start=$_SESSION['quiz']; 
       $end=date('Y-m-d H:i:s', strtotime($_SESSION['quiz'] . ' +'.$quizlength.' minutes')); 
       echo " 
        var date_quiz_start='$start'; 
        var date_quiz_end='$end'; 
        var time_quiz_end=new Date('$end').getTime();"; 
      ?> 
     </script> 
     <script src='quiz-timer.js'></script><!-- see below --> 
     <style> 
      #display,#actions,#question {display:block;font-family:calibri,verdana,arial;font-size:0.9rem;box-sizing:border-box;} 
      #display{margin:0 auto 1rem auto;} 
      #actions{margin:1rem auto;} 
      #question{color:red} 
     </style> 
    </head> 
    <body> 
     <div id='display'> 
      <div id='starttime'></div> 
      <div id='endtime'></div> 
      <div id='showtime'></div> 
     </div> 
     <div id='question'> 
      <?php 
       echo "Display question based upon page $page"; 
      ?> 
     </div> 
     <div id='actions'> 
      <input id='prev' type='button' data-page='<?php echo $page;?>' value='Previous' /> 
      <input id='next' type='button' data-page='<?php echo $page;?>' value='Next' /> 
     </div> 
    </body> 
</html> 

두 번째는 포함 된 파일입니다 - quiz.inc

<?php 
    /* session header for quiz experiments */ 
    /* 
     to reset use ?del=1 
    */ 
    if(!empty($_GET['del']) && !empty($_SESSION['quiz'])) { 
     unset($_SESSION['quiz']); 
     header('Location: so-quiz.php'); 
    } 

    if(empty($_SESSION['quiz'])){ 
     $_SESSION['quiz']=date('Y-m-d H:i:s'); 
     $_SESSION['quizlength']=20; 
    } 
    $quizlength=$_SESSION['quizlength']; 
    $page=filter_input(INPUT_GET, 'page', FILTER_SANITIZE_NUMBER_INT); 
    if(empty($page)) $page=1; 
?> 

그리고 마지막으로 자바 스크립트 quiz-timer.js

document.addEventListener('DOMContentLoaded', function(){ 
     document.getElementById('next').onclick=function(e){ 
      location.search='page='+(parseInt(e.target.dataset.page) + 1) 
     }; 
     document.getElementById('prev').onclick=function(e){ 
      if(parseInt(e.target.dataset.page) > 1) location.search='page='+(parseInt(e.target.dataset.page) - 1) 
     }; 

     (function(time){ 
      var now=new Date().getTime(); 
      var difference = time_quiz_end - now; 
      var days = Math.floor(difference/(1000 * 60 * 60 * 24)); 
      var hours = Math.floor((difference % (1000 * 60 * 60 * 24))/(1000 * 60 * 60)); 
      var minutes = Math.floor((difference % (1000 * 60 * 60))/(1000 * 60)); 
      var seconds = Math.floor((difference % (1000 * 60))/1000); 

      t=setTimeout(arguments.callee, time); 

      if(difference <= 0){ 
       clearTimeout(t); 
       alert('GAME OVER'); 
       /* redirect user, display message, stand on one leg or whatever you need to do - quiz has finished */ 
       return false; 
      } 

      document.getElementById("starttime").innerHTML='Quiz began at: '+date_quiz_start; 
      document.getElementById("endtime").innerHTML='Quiz will end at: '+date_quiz_end; 
      document.getElementById("showtime").innerHTML = 'Time remaining: '+days + "d " + hours + "h " + minutes + "m " + seconds + "s "; 
     })(1000); 
    },false); 
라고

previous, Next 버튼은 페이지를 다시로드하고 실제로 다른 페이지로드를 에뮬레이션하는 페이지 카운터를 증가시킵니다. 포함 된 quiz.inc이 세션을 유지 관리하므로 시간/카운트 다운 표시가 유지됩니다.

+0

안녕 RamRaider 대단히 감사합니다. 이것은 훌륭하고 솔루션은 잘 작동합니다. 그러나 문제는 학생이 첫 번째 질문에 대답을 마칠 때마다 각 질문을 다른 PHP 페이지에 보관하고 다음 타이머 질문을 다시 클릭하면 다음 질문을 위해 처음부터 다시 시작됩니다. 사용자가 퀴즈를 복용하는 동안 지속적으로 표시되는 타이머 수. 사용자가 완료 될 때까지. –

+0

$ _ SESSION [ 'quiz'] = date ('Ymd H : i : s');'각 세션마다 동일한 줄'if (empty ($ _SESSION [ 'quiz']) 타이머가 유지됩니다 – RamRaider

+0

예, 시도했지만 작동하지 않습니다. 타이머가 각 질문마다 다시 시작됩니다. –

관련 문제