1

ページのロックとロック解除機能のようなものを作成しようとしています。ユーザーは次の順序でページを移動する必要があります。

$steps = array(1 =>'create_session.php',2 => 'QandATable.php',3 => 'individualmarks.php',4 => 'penalty.php',5 => 'penaltymarks',6 => 'complete.php');

したがって、ユーザーがあるべきページにいる場合、そのページのロックを解除する必要があります (つまり、ページのコードを表示する if ステートメントに一致する)。それらがオンになっていない場合、そのページはロックされます (else ステートメントは、Continueハイパーリンク付きの div を表示する場所で満たされます)。

問題は、ユーザーが正しいページにいるにもかかわらず、ユーザーがページを使用できるようにロックを解除する必要があるときに、ページがまだ「ロック」されていることです。現時点では、アクセスしたすべてのページがロックされているため、ユーザーが正しいページにいるときにページのロックを解除するにはどうすればよいですか?

以下は、create_session.php の例です。

 <?php
session_start();
include ('steps.php'); //exteranlised steps.php
?>
<head>
...

</head>
<body>

<?php
if ((isset($username)) && (isset($userid))) { //checks if user is logged in
    if (allowed_in() === "Allowed") {
        //create_session.php code:
    } else {
        $page = allowed_in() + 1;
?>
 <div class="boxed">
<a href="<?php echo $steps[$page] ?>">Continue with Current Assessment</a>
<?php
    }

} else {
    echo "Please Login to Access this Page | <a href='./teacherlogin.php'>Login</a>";
    //show above echo if user is not logged in
}
?>

以下は完全な steps.php です。

<?php

$steps = array(1 =>'create_session.php',2 => 'QandATable.php',3 => 'individualmarks.php',4 => 'penalty.php',5 => 'penaltymarks',6 => 'complete.php');

function allowed_in($steps = array()){
// Track $latestStep in either a session variable
// $currentStep will be dependent upon the page you're on

if(isset($_SESSION['latestStep'])){
   $latestStep = $_SESSION['latestStep'];
}
else{
   $latestStep = 0;
}
$currentStep = basename(__FILE__); 

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

if ($currentIdx - $latestIdx == 1 )
    {
       $currentIdx = $_SESSION['latestStep'];
       return 'Allowed';
    }
    return $latestIdx;
}

?>
4

2 に答える 2

3

これはおそらくそのままでは機能しませんが、次のようなものです。

$allowed_page = $_SESSION['latestStep'];
if ($steps[$allowed_page] == $_SERVER['SCRIPT_NAME']) {
   ... allowed to be here ...
}

基本的に、「ステップ」の配列を指定すると、許可されたページのインデックスをセッションに保存します。ユーザーがページを完了して次のページの「ロックを解除」すると、セッションでそのインデックス値をインクリメントし、シーケンスの次のページにリダイレクトします。

if ($page_is_done) {
    $_SESSION['latestStep']++;
    header("Location: " . $steps[$_SESSION['latestStep']]);
}
于 2013-01-05T19:00:28.860 に答える
1

シンプルにしてください。目標を複雑にしすぎているようです。ユーザーが次のプロセスに進む前に、プロセスの前のステップを完了させたいだけのようです。もっと何か試してみませんか...

// General Idea
$completedArr = array('1' => false, '2' => false ...);
$pageMap = array('page1.php' => '1', 'page2.php' => '2' ...);

// On Page1
$completedArr = $_SESSION['completedArr'];
$locked = true;
$currentStep = $pageMap[$_SERVER['SCRIPT_NAME']];  // '1'
if($currentStep > 1)
{
    if($completedArr[$currentStep - 1] === true)
        $locked = false;
}
else
{
    $locked = false;
}

$completedArr[$currentStep] = true;
$_SESSION['completedArr'] = $completedArr;

連続ページにも必要に応じて使用します。アイデアは、スクリプト名にインデックス番号を与えるように定義する pageMap です。次に、このページを「ロック解除」する前に、前のインデックスが完了としてマークされていることを確認するだけです。

于 2013-01-05T19:08:13.170 に答える