PHP多项选择测验 - 如何在80个问题中显示20个随机问题

时间:2014-08-24 17:11:12

标签: php sql

我的网站现已完成,这是需要排序的最后一件事。我在数据库中添加了80个问题。我选择专注于分数(加法,减法,乘法和除法)。

测验显示所有80,并且一旦用户完成测验,屏幕上会显示结果!

我需要一些建议,我希望测验能够从数据库中生成20个ramdom问题。如何才能做到这一点?我正和某人说话,他说我必须有一个柜台(20)和一个阵列来帮助解决这个问题 - 有没有人有任何想法?

这是目前为止的测验代码:

    <head>
    <link rel="stylesheet" type="text/css" href="/css/style.css" />
</head>
<?php
require 'core/init.php';
include('inc/pheader.php'); ?>

<?php

session_start();
if(isset($_GET['question'])){
    $question = preg_replace('/[^0-9]/', "", $_GET['question']);
    $next = $question + 1;
    $prev = $question - 1;
    if(!isset($_SESSION['qid_array']) && $question != 1){
        $msg = "Sorry! No cheating.";
        header("location: start.php?msg=$msg");
        exit();
    }
    if(isset($_SESSION['qid_array']) && in_array($question, $_SESSION['qid_array'])){
        $msg = "Sorry, Cheating is not allowed. You will now have to start over. Haha.";
        unset($_SESSION['answer_array']);
        unset($_SESSION['qid_array']);
        session_destroy();
        header("location: start.php?msg=$msg");
        exit();
    }
    if(isset($_SESSION['lastQuestion']) && $_SESSION['lastQuestion'] != $prev){
        $msg = "Sorry, Cheating is not allowed. You will now have to start over. Haha.";
        unset($_SESSION['answer_array']);
        unset($_SESSION['qid_array']);
        session_destroy();
        header("location: start.php?msg=$msg");
        exit();
    }
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Quiz Page</title>
<script type="text/javascript">
function countDown(secs,elem) {
    var element = document.getElementById(elem);
    element.innerHTML = "You have "+secs+" seconds remaining.";
    if(secs < 1) {
        var xhr = new XMLHttpRequest();
        var url = "userAnswers.php";
            var vars = "radio=0"+"&qid="+<?php echo $question; ?>;
            xhr.open("POST", url, true);
            xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            xhr.onreadystatechange = function() {
        if(xhr.readyState == 4 && xhr.status == 200) {
            alert("You did not answer the question in the allotted time. It will be marked as incorrect.");
            clearTimeout(timer);
    }
}
xhr.send(vars);
        document.getElementById('counter_status').innerHTML = "";
        document.getElementById('btnSpan').innerHTML = '<h2>Times Up!</h2>';
        document.getElementById('btnSpan').innerHTML += '<a href="quiz.php?question=<?php echo $next; ?>">Click here now</a>';

    }
    secs--;
    var timer = setTimeout('countDown('+secs+',"'+elem+'")',1000);
}
</script>
<script>
function getQuestion(){
    var hr = new XMLHttpRequest();
        hr.onreadystatechange = function(){
        if (hr.readyState==4 && hr.status==200){
            var response = hr.responseText.split("|");
            if(response[0] == "finished"){
                document.getElementById('status').innerHTML = response[1];
            }
            var nums = hr.responseText.split(",");
            document.getElementById('question').innerHTML = nums[0];
            document.getElementById('answers').innerHTML = nums[1];
            document.getElementById('answers').innerHTML += nums[2];
        }
    }
hr.open("GET", "questions.php?question=" + <?php echo $question; ?>, true);
  hr.send();
}
function x() {
        var rads = document.getElementsByName("rads");
        for ( var i = 0; i < rads.length; i++ ) {
        if ( rads[i].checked ){
        var val = rads[i].value;
        return val;
        }
    }
}
function post_answer(){
    var p = new XMLHttpRequest();
            var id = document.getElementById('qid').value;
            var url = "userAnswers.php";
            var vars = "qid="+id+"&radio="+x();
            p.open("POST", url, true);
            p.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            p.onreadystatechange = function() {
        if(p.readyState == 4 && p.status == 200) {
            document.getElementById("status").innerHTML = '';
            alert("Thanks, Your answer was submitted"+ p.responseText);
            var url = 'quiz.php?question=<?php echo $next; ?>';
            window.location = url;
    }
}
p.send(vars);
document.getElementById("status").innerHTML = "processing...";

}
</script>
<script>
window.oncontextmenu = function(){
    return false;
}
</script>
</head>

<body onLoad="getQuestion()">
<div id="status">
<div id="counter_status"></div>
<div id="question"></div>
<div id="answers"></div>
</div>
<script type="text/javascript">countDown(45,"counter_status");</script>
</body>
</html> 

2 个答案:

答案 0 :(得分:1)

你的数据库是什么?我假设MYSQL?那么这个select语句可能对你有所帮助。

它不会产生重复:

select * from my_question_table order by rand() limit 0,20;

它将从表“my_question_table”中选择所有内容(*),随机排序结果并选择前20行。

编辑:刚看到TJ的评论。由于他比我快,他应该得到声誉。

答案 1 :(得分:0)

首先让我说我的生活中从未做过一系列的PHP,所以这可能不起作用。

试试这个:

 for ($i = 1; $i <= 20; $i++) {
     $var = rand(1,80);
     //code to get answer from SQL database.
 }

此代码可能会出现重复项。我会用一个数组来阻止它,但我完全不知道如何创建一个。在sudo代码中:

define array called "array"
start for statement to count 20 times.
start nested for statement
check if this random number is the same as any other in the array
if not, continue
if so, variable in for statement = value - 1 (for above code, the variable is called i)
get random number and add it to the array.