7

ユーザーが試験を作成するには、次のページを通過する必要がある試験アプリケーションがあります。

  • create_session.php
  • QandATable.php
  • 個人マーク.php
  • ペナルティ.php
  • 完全な.php

今私が心配しているのは、ユーザーがこれらのページのいくつかを完了することができるが、他のページを除外して試験の作成を放棄するか、上のページのいくつかを通過する試験の作成を開始してから、元に戻ることができることです。前のページまたは前のページ、または先に表示される他のページの URL を入力してページをスキップします。

だから私の質問は、ユーザーがページをスキップしたり、前のページに戻ったりするのを止める方法はありますか? つまり、試験を作成するには、上記の 5 ページを正確な順序で実行する正確な手順に従う必要があります。

たとえば、ユーザーが を使用している場合QandATable.php page、create_session.php ページに戻ることはできませんか、またはQandATable.phpが正常に送信されるまで他のページにスキップすることはできませんか? つまり、現在のページ以外の他のページをロックアウトします。ユーザーがページにアクセスするcomplete.phpと、検査が完了しcreate_session.php、最初のページであるため、ロックアウトから削除できます。

ユーザーが individualmarks.php などのページを放棄して、ユーザーが直接 indivdualmarks.php のページに戻る場合は問題ありませんが、別のページにアクセスしようとすると、プロンプト ボックスまたは何かを送信することを考えています。同様の記載:

すでに作成中の試験があります。現在の試験の作成を続行するには、このリンクをクリックしてください (現在のページ ユーザーがオンになっているページへのリンク)

新しい試験を作成する場合は、このリンク (create_session.php ページへのリンク) をクリックしてください。

私が求めていることはそれほど単純ではないことはわかっていますが、ユーザーが各ステップ (各ページ) を正しい順序で実行しない限り、ユーザーが試験の作成を台無しにして、データを台無しにしないようにしたくありません。これをどのように達成できるかについての簡単なサンプルはありますか?

私はIE、Chromeで作業しています。サファリ、ファイアフォックス、オペラ

ありがとう

アップデート:

<?php

session_start();

?>

    <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="stepsStyle.css">
        <title>Follow Steps</title>

        <script type="text/javascript">

//if user selects "Create New Assessment" Link, then use jquery/ajax below
//code below will access removesession.php where it will remove exam details which will be overwritten

$(function() {
    var link = $("#createLink");

    link.click(function() {
        $.ajax({
           url: "removesession.php",
           async: false,
           type: "POST",
           success: function() {
                window.location.href = link.attr("href");
           }
         });

         //cancels the links true action of navigation
         return false;
    });
);

</script>

        </head>
        <body>

<?php

$steps = array('create_session.php', 'QandATable.php', 'individualmarks.php', 'penalty.php', 'complete.php');

$latestStep = $_SESSION['latestStep'];
// Track $latestStep in either a session variable or the DB and retrieve accordingly
// $currentStep will be dependent upon the page you're on

$currentIdx = array_search($currentStep, $steps);
$latestIdx = array_search($latestStep, $steps);

if ($currentIdx - $latestIdx > 1 ) {
    ?>

//set up a div box to display message on wether use should contine or not
<div class="boxed">
  You already have an exam currently in creation, to continue with creating the current exam click on this link: <br/><a href="">Continue with Current Assessment</a>
<br/>
If you want to create a new exam then please click on this link: <br/><a href="create_session.php" id="createLink">Create New Assessment</a>
</div>

<?

} else {
    // let the user do the step
}

?>

上記のコードに関するいくつかの質問があります。

  1. 変数は何$currentStepに等しくなければなりませんか?
  2. ユーザーが現在の試験を続行したい場合、現在のページにリンクするにはどうすればよいですか?
  3. ユーザーがステップを実行できるようにするには、else ステートメントを空のままにしておく必要がありますか?
4

2 に答える 2

3

あいまいさによるセキュリティは、実際には単純なスキームです。URL は公開されていると常に想定する必要があります。ここでは、ウィザードのようなインターフェイスが必要です。これは、有限状態マシンです。システムにすでにユーザーがいると仮定すると、ワークフロー エンジン (または FSM 実装、または単純なものを自分で開発する) を見つけて、すべてのフロー内でユーザーの送信を追跡する必要があります。

すべてのページの最初で、ユーザーの位置を検証する必要があります。つまり、ユーザーが現在の状態で要求されたリソースにアクセスできるかどうかを確認する必要があります。リダイレクトできない場合は、要求されたページを表示します。

ところで、アプリケーションをゼロから構築しているようです。ファースト トラックは、CakePHPなどのフレームワークを使用することです。この素晴らしいプラグインを見つけたので、Cake をお勧めします(自分で使用したことはありませんが、API は本当に素晴らしく、Cake 自体は学習目的に最適です)。

于 2013-01-03T00:42:17.723 に答える
1

変数で最後に完了した状態を追跡し、リストでワークフローを追跡します。各ページで、最後に完了した状態が、以前の必要な手順以上であるかどうかを確認します。これは、ワークフローが完全に線形であることを前提としています。このようなもの:

$steps = array('create', 'table', 'marks', 'penalty', 'complete');

// Track $latestStep in either a session variable or the DB and retrieve accordingly
// $currentStep will be dependent upon the page you're on

$currentIdx = array_search($currentStep, $steps);
$latestIdx = array_search($latestStep, $steps);

if ($currentIdx - $latestIdx > 1 ) {
    // show error message
} else {
    // let the user do the step
}

編集:質問に答える:

$currentStep 変数は何に等しくなければなりませんか?

これは、現在のページと等しく、$steps の値と一致する必要があります。現在のページのファイル名であるように見えます。

ユーザーが現在の試験を続行したい場合、現在のページにリンクするにはどうすればよいですか?

ユーザーがページにいる場合、正しいステップにリダイレクトする方法を尋ねているように聞こえます。次のステップは$steps[$latestIdx + 1]、たとえば最新のステップの次のステップです。

ユーザーがステップを実行できるようにするには、else ステートメントを空のままにしておく必要がありますか?

else ステートメントには、ユーザーに実行させたいすべてのコードを含める必要があります。または、これを外部化する場合は、おそらく戻り値を使用し、ステップを実行できる場合は 1 を返し、実行できない場合は 0 を返す必要があります。次に、各ページでこの関数を呼び出し、戻り値に応じてページを表示するか、エラーを表示します。

于 2013-01-03T00:49:43.790 に答える