如何使用Php停止重新提交表单?

时间:2014-08-16 21:33:33

标签: php html forms

我正在为Quiz竞赛制作网络应用程序。为此,我写了一个由同一页面处理的php脚本。现在,当我添加分数和问题数字时,如果有人刷新页面,则分数会增加或保持不变,具体取决于之前的答案。现在我用Google搜索了问题并找到了类似PRG的内容。但是如果页面由其他页面处理(我的想法),这种方法也有效。我的一位朋友再次告诉我使用Javascript。但是如果有人把Js关掉呢?我们不能在php本身有一个解决方案。我也尝试了会话方法,但我没有解决问题。  请帮我 。

PHP测验脚本在这里:

<?php 

    // starting session
    session_start();
    if (!isset($_SESSION['user_id'])) {
    echo '<p class="login">Please <a href="login.php">log in</a> to access this page.</p>';
    exit();
  }
  else {
    echo('<p class="login">You are logged in as ' . $_SESSION['username'] . '. <a href="logout.php">Log out</a>.</p>');
  }
     // $query = ;
  //this get is taking level from index.php

    if ( isset($_GET['level']))
    {
        $level = $_GET['level'];
    }       

    else
    {
        $level = 'E';
    }

    //connecting to Data Base
    require_once('connectvars.php');
    $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

    if (isset($_POST['submit']))
    {
        $level = $_POST['level'];
        // $_SESSION['flag']
        $answer = $_POST['answer'];
        if ( !empty($answer))
        {

            $qid = $_POST['qid'];
            $select = $_POST['select'];
            $user_id = $_SESSION['user_id'];

            $result = mysqli_query($dbc,"select * from question where qid = '$qid'")
            or die("Error in connection.");

            $row = mysqli_fetch_array($result);

            if ( $row['ANSWER'] == $answer)
            {
                echo 'Your answer is correct.';
                mysqli_query($dbc,"insert into user_question ( qid,user_id,answer_key) values ( '$select','$user_id',1)")
                or die ("Error in updating values in user_question");

            }
            else
            {
                echo 'Your answer is incorrect.';
                mysqli_query($dbc,"insert into user_question ( qid,user_id,answer_key) values ( '$select','$user_id',0)")
                or die ("Error in updating values in user_question");           
            }
            $answer = "";
        }
        else
        {
            echo 'You did not answer the previous question';
        }



    }


        $user_id = $_SESSION['user_id'];
        // $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

        //Taking a random value from the list of question
        $id_list = array();
        // echo $user_id;
        // echo $level;
        $result = mysqli_query($dbc,"select * from question where lvl = '$level' and user_id != '$user_id' and qid not in ( select qid from user_question where user_id = '$user_id' )");
        while ( ($row = mysqli_fetch_array($result)) )
        {
            if ( $row['user_id'] != $user_id)
            array_push($id_list,$row['qid']);
        }
        // print_r($id_list);
        //Whether user viewed all the questions
        if ( empty($id_list))
        {
            echo 'Great, You have visited all the question, wait for more update ';
            echo '<br>';
             echo '&#10084; <a href="view_score.php">View Your Score</a><br />';
            exit();
        }
        // Taking a random value after shuffling it

        shuffle($id_list);
        $select = $id_list[array_rand($id_list)];



        $result = mysqli_query($dbc,"select * from question where qid='$select'");

        // Showing the question
        while ( ($row = mysqli_fetch_array($result)) )
        {
            ?>
            <!DOCTYPE html>
            <html>
            <head>
                <title></title>
            </head>
            <body>
                <h3> <?php echo $row['sawal']; ?></h3>

                    <form  method = "POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">

                        <input type="radio"  name=" answer" value="A" ><?php echo $row['a']; ?><br>
                        <input type="radio"  name=" answer" value="B" ><?php echo $row['b']; ?><br>
                        <input type="radio"  name=" answer" value="C" ><?php echo $row['c']; ?><br>
                        <input type="radio"  name=" answer" value="D" ><?php echo $row['d']; ?><br>

                        <input type="hidden" name = "qid" value="<?php echo $row['qid'] ?>">
                     <!--    <input type="hidden" name = "range" value="<?php  $range ?>"> -->
                        <input type="hidden" name = "level" value="<?php  echo $level ?>">
                        <input type="hidden" name = "select" value="<?php  echo $select ?>">

                        <input type="submit" name="submit" value="ANSWER"/>

                    </form>

            </body>
            </html>
        <?php
        require_once('view_score.php');
    }


 ?>

编辑:

我建议改变我的代码。但它不允许我从表中提出不同的问题吗?

修改后的PHP代码在这里:

<?php 

// starting session
session_start();


  if (!isset($_SESSION['user_id'])) {
    echo '<p class="login">Please <a href="login.php">log in</a> to access this page.</p>';
    exit();
  }
  else {
    echo('<p class="login">You are logged in as ' . $_SESSION['username'] . '. <a href="logout.php">Log out</a>.</p>');
  }
     // $query = ;
  //this get is taking level from index.php

    if ( isset($_GET['level']))

{
    $level = $_GET['level'];
}       

else
{
    $level = 'E';
}

//connecting to Data Base
require_once('connectvars.php');
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

if (isset($_POST['submit']))
{



$is_new_post = true;
if (isset($_SESSION["myform_key"]) && isset($_POST["myform_key"]))
 { 

  if($_POST["myform_key"] == $_SESSION["myform_key"] ){
    $is_new_post = false;
  } 
}
 if($is_new_post){

  $_SESSION["myform_key"] = $_POST["myform_key"];




    $level = $_POST['level'];
    // $_SESSION['flag']
    $answer = $_POST['answer'];
    if ( !empty($answer))
    {

        $qid = $_POST['qid'];
        $select = $_POST['select'];
        $user_id = $_SESSION['user_id'];

        $result = mysqli_query($dbc,"select * from question where qid = '$qid'")
        or die("Error in connection.");

        $row = mysqli_fetch_array($result);

        if ( $row['ANSWER'] == $answer)
        {
            echo 'Your answer is correct.';
            mysqli_query($dbc,"insert into user_question ( qid,user_id,answer_key) values ( '$select','$user_id',1)")
            or die ("Error in updating values in user_question");

        }
        else
        {
            echo 'Your answer is incorrect.';
            mysqli_query($dbc,"insert into user_question ( qid,user_id,answer_key) values ( '$select','$user_id',0)")
            or die ("Error in updating values in user_question");           
        }
        $answer = "";
    }
    else
    {
        echo 'You did not answer the previous question';
    }

        }

}


    $user_id = $_SESSION['user_id'];
    // $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

    //Taking a random value from the list of question
    $id_list = array();
    // echo $user_id;
    // echo $level;
    $result = mysqli_query($dbc,"select * from question where lvl = '$level' and user_id != '$user_id' and qid not in ( select qid from user_question where user_id = '$user_id' )");
    while ( ($row = mysqli_fetch_array($result)) )
    {
        if ( $row['user_id'] != $user_id)
        array_push($id_list,$row['qid']);
    }
    // print_r($id_list);
    //Whether user viewed all the questions
    if ( empty($id_list))
    {
        echo 'Great, You have visited all the question, wait for more update ';
        echo '<br>';
         echo '&#10084; <a href="view_score.php">View Your Score</a><br />';
        exit();
    }
    // Taking a random value after shuffling it

    shuffle($id_list);
    $select = $id_list[array_rand($id_list)];



    $result = mysqli_query($dbc,"select * from question where qid='$select'");

    // Showing the question
    while ( ($row = mysqli_fetch_array($result)) )
    {
        ?>
        <!DOCTYPE html>
        <html>
        <head>
            <title></title>
        </head>
        <body>
            <h3> <?php echo $row['sawal']; ?></h3>

                <form  method = "POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">

                    <input type="radio"  name=" answer" value="A" ><?php echo $row['a']; ?><br>
                    <input type="radio"  name=" answer" value="B" ><?php echo $row['b']; ?><br>
                    <input type="radio"  name=" answer" value="C" ><?php echo $row['c']; ?><br>
                    <input type="radio"  name=" answer" value="D" ><?php echo $row['d']; ?><br>

                    <input type="hidden" name = "qid" value="<?php echo $row['qid'] ?>">
                 <!--    <input type="hidden" name = "range" value="<?php  $range ?>"> -->
                    <input type="hidden" name = "level" value="<?php  echo $level ?>">
                    <input type="hidden" name = "select" value="<?php  echo $select ?>">
                     <input type="hidden" name="myform_key" value="<?php echo md5("CrazyFrogBros"); ?>" />

                    <input type="submit" name="submit" value="ANSWER"/>

                </form>

        </body>
        </html>
    <?php
    require_once('view_score.php');
}

&GT;

1 个答案:

答案 0 :(得分:0)

  

我也尝试了会话方法,但我没有解决问题

我不知道您是如何编码的,但您可以尝试这样做: 1.设置具有唯一散列值的会话令牌,例如

$_SESSION['formtoken'] = sha1(uniqid('', true));
  1. 将其包含在您的表单中(输入隐藏)value = $ _SESSION [&#39; formtoken&#39;]
  2. 每当用户提交表单时,重置$ _SESSION [&#39; formtoken&#39;]值