0

PHPとJavascriptでクイズアプリを開発しています。ユーザーが送信ボタンを押すと、クイズが開始されます (いつクイズを開始するかは制御しません)。クイズは特定の時間後に停止する必要があります(私が決定します)。クライアント PC の時刻は変更される可能性があるため、時間を停止するためにクライアント コンピューターに完全に依存したくありません。ページの更新時にクイズを再開しないでください。

setInterval と基本的な JavaScript を知っています。これまでに開発した機能は完全に機能しますが、ページを更新するとクイズが再開されます。

function formatSecondsAsTime(secs) {
    var hours = Math.floor(secs / 3600);
    var minutes = Math.floor(secs / 60) - (hours * 60);
    var seconds = secs - (hours * 3600) - (minutes * 60);
    return hours + ':' + minutes + ':' + seconds;
}

function startTimer(mytime) {
    mytime = mytime.split(":");
    hrs = mytime[0];
    parseInt(hrs, 10);
    mins = mytime[1];
    parseInt(mins, 10)
    secs = mytime[2];
    parseInt(secs, 10);
    if (hrs > 0 || mins > 0 || secs > 0) {
        timerVar = setInterval(function () {
            if (secs > 0) //time is less than a minute
            {
                displayTime(hrs, mins, secs--);
            }
            else if (secs == 0 && mins > 0) {

                displayTime(hrs, mins = mins - 1, secs = secs + 59);
            }
            else if (secs == 0 && mins == 0 && hrs > 0) {
                displayTime(hrs--, mins = mins + 59, secs = secs + 59);
            }
            else if (secs == 0 && mins == 0 && hrs == 0) {
                clearTimeout(timerVar);
                displayTime(0, 0, 0);
            }
        }, 1000);
    }
    else {
        displayTime(0, 0, 0);
    }
}


function displayTime(hrs, mins, secs) {
    if (secs > 0 || hrs > 0 || mins > 0) {
        if ((secs.toString()).length < 2) secs = "0" + secs;
        if ((mins.toString()).length < 2) mins = "0" + mins;
        if ((hrs.toString()).length < 2) hrs = "0" + hrs;

        document.getElementById("quiztime").innerHTML = "Time remaining: " + hrs + ":" + mins + ":" + secs;
    }
    else {
        document.getElementById("quiztime").innerHTML = "Quiz has ended!";
        alert("Quiz has ended. Click ok to continue.");
        document.forms["answerForm"].submit();
    }
}

最善の方法を教えてください。

ありがとうございました。

4

3 に答える 3

4

これを実現するための最良の方法の1つは、次のとおりです。クイズの開始時に、サーバーにAJAXリクエストを送信して、PHPスクリプトに開始を通知します。PHPスクリプトは、開始時刻を保持しているそのユーザーのセッション変数を格納する必要があります。クイズの送信時に、現在の時刻とセッションに保存されている開始時刻の差が許可された時間よりも大きくないことを確認してください。

クライアントはセッション変数を編集または表示できません。クライアントがクイズの途中でページをロードする場合は、セッションの開始時間に基づいて、JSタイマーの量を残り時間に設定します。

于 2012-06-27T21:01:51.330 に答える
1

Cookie を使用して、現在のユーザーが開始されたクイズに参加しているかどうかを判断することをお勧めします。つまり、ユーザーが送信をクリックすると、PHP で Cookie が設定され、開始時刻がデータベースに記録されます。ユーザーがページにアクセスするたびに、その Cookie を確認し、データベースからレコードを取得します。これで、クイズ終了までの残り時間を知ることができます。

于 2012-06-27T20:41:26.423 に答える
0

Cookie は、開始時刻を記憶するための鍵です。送信時にphpでCookieに開始時間を設定します。これと同じ時刻をスクリプト要素でページに書き込む必要があります (サーバーとクライアントの両方が開始時刻を認識します)。Cookie を保護するために、サーバー側で暗号化できます。Cookie の値と js の値を比較することで、開始時刻が改ざんされていないことを確認できます (テストの完了時)。

ページがリロードされ、Cookie が存在する場合は、新しい時間を設定するのではなく、Cookie から時間を取得します。

于 2012-06-27T20:58:52.263 に答える