PHP multi choice quiz- how to show 20 random questions out of 80 questions

Hi guys. I’m Rich and only just joined this forum. I hope that you can help me please as I’m ready to rip my hair out!

At the moment I’m re-creating the website that I designed for my dissertation while I was at uni. This is also going to be my portfolio to show employers my skills and knowledge which will help me to get a graduate PHP web developer job. Over the past few weeks I have had a number of job offers but they cannot offer me an interview untill I have my website up and running and on a web domain.

The webs site is a learning aid for people like myself who have the learning disability called dyscalculia. There are revision pages that are now complete. I have got a quiz with 80 questions. I would like to be able to show just 20 questions that are random.

This is the quiz code so far:

       <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>

Any help would be much appreciated

Thanks guys

Rich

Assuming that the questions are being stored in an array (presumably after having been fetched from a database), there’s a couple of ways that you could go about it:

  1. Use the array_rand() function to randomly choose 20 questions from an array of 80 potential questions.

  2. Use shuffle() on the array and use while loop with a count to only loop though 20 times.