2011-09-23 84 views
1

我正在構建一個基本網站,該網站將提供從MySQL數據庫動態生成的測驗。基於我當前的數據庫模式,我無法理解如何在Quiz Web App中爲不同的問題生成「選擇」。使用PHP從數據庫生成HTML表格

下面是數據庫模式:

CREATE TABLE user (
    user_id INT UNSIGNED PRIMARY KEY, 
    username VARCHAR(32) NOT NULL UNIQUE, 
    password VARCHAR(128) NOT NULL, 
    ... 
) Engine=InnoDB; 

CREATE TABLE quiz (
    quiz_id INT UNSIGNED PRIMARY KEY, 
    title VARCHAR(64) 
) Engine=InnoDB; 

CREATE TABLE question (
    question_id INT UNSIGNED PRIMARY KEY, 
    quiz_id INT UNSIGNED NOT NULL, 
    question VARCHAR(1024), 
    FOREIGN KEY (quiz_id) REFERENCES quiz (quiz_id) 
) Engine=InnoDB; 

CREATE TABLE question_choices (
    choice_id INT UNSIGNED PRIMARY KEY, 
    question_id INT UNSIGNED NOT NULL, 
    is_correct_choice TINYINT(1), 
    choice VARCHAR(512), 
    FOREIGN KEY (question_id) REFERENCES question (question_id) 
) Engine=InnoDB; 

CREATE TABLE quiz_response (
    response_id INT UNSIGNED PRIMARY KEY, 
    user_id INT UNSIGNED NOT NULL, 
    question_id INT UNSIGNED NOT NULL, 
    response INT UNSIGNED NOT NULL, 
    is_correct TINYINT(1), 
    answer_time FLOAT, 
    UNIQUE KEY (user_id, question_id) 
    FOREIGN KEY (user_id) REFERENCES user (user_id), 
    FOREIGN KEY (question_id) REFERENCES question (question_id), 
    FOREIGN KEY (response) REFERENCES question_choices (choice_id), 
) Engine=InnoDB; 

這是我在quiz.php腳本到目前爲止所生成的代碼:

// If this user has never taken this quiz, insert empty responses into the quiz_response table 
    $query = "SELECT * FROM quiz_response WHERE user_id = '" . $_SESSION['user_id'] . "'"; 
    $data = mysqli_query($dbc, $query); 
    if (mysqli_num_rows($data) == 0) { 
     //First grab the list of questions to create empty responses 
     //Grab all questions from question table 
     //Rework code in the future to accommodate multiple quizes 
     $query = "SELECT question_id from question"; 
     $data = mysqli_query($data, $query); 
     $questionIDs = array(); 
     while ($row = mysqli_fetch_array($data)) { 
      array_push($questionIDs, $row['question_id']); 
     } 

     // Insert empty response rows into the response table, one row per question 
     foreach ($questionIDs as $question_id) { 
      $query = "INSERT INTO quiz_response (user_id, question_id) VALUES ('" . $_SESSION['user_id']. "', '$question_id')"; 
      mysqli_query($dbc, $query); 
     } 
    } 

    // If the quiz form has been submitted, write the form responses to the database 
    if (isset($_POST['submit'])) { 
     // Write the quiz response rows to the response table 
     foreach ($_POST as $response_id => $response) { 
      $query = "UPDATE quiz_response SET response = '$response' WHERE response_id = '$response_id'"; 
      mysqli_query($dbc, $query); 
     } 
     echo '<p>Your responses have been saved.</p> 
    } 

    // Grab the response data from the database to generate the form 
    $query = "SELECT qr.response_id, qr.question_id, qr.response, q.question, quiz.quiz " . 
     "FROM quiz_response AS qr " . 
     "INNER JOIN question AS q USING (question_id) " . 
     "INNER JOIN quiz USING (quiz_id) " . 
     "WHERE qr.user_id = '" . $_SESSION['user_id'] . "'"; 
    $data = mysqli_query($dbc, $query); 
    $responses = array(); 
    while ($row = mysqli_fetch_array($data)) { 
     // Pull up the choices for each question 
     $query2 = "SELECT choice_id, choice FROM question_choice " . 
      "WHERE question_id = '" . $row['question_id'] . "'"; 
     $data2 = mysqli_query($dbc, $query2); 
     $choices = array(); 
     while ($row2 = mysqli_fetch_array($data2)) { 
      array_push($choices, $row2); 
     } 
     // Rename choices 




     // Eventually push choices into $responses array 
     // array_push($responses, $row); 
    } 

    mysqli_close($dbc); 

    // Generate the quiz form by looping through the response array 
    echo '<form method="post" action="' . $_SERVER['PHP_SELF'] . '">'; 
    echo '<h2>' . $page_title . '</h2>'; 
    $question_title = $responses[0]['question']; 
    echo '<label for="' . $responses[0][response_id'] . '">' . $responses[0]['question'] . '</label><br />'; 
    foreach ($responses as $response) { 
     // Only start a new question if the question changes 
     if ($question_title != $response['question']) { 
      $question_title = $response['question']; 
      echo '<br /><label for="' . $response['response_id'] . '">' . $response['question'] . '</label><br />'; 
     } 
     // Display the choices 
     // Choice 1 
     // Choice 2 
     // Choice 3 
     // Choice 4 


    } 
    echo '<br /><br />'; 
    echo '<input type="submit" value="Grade Me!" name="submit" />'; 
    echo '</form>'; 

我無法拉動選擇的選擇了的question_choice表,並使用它們來填充表單。我可以將choice_id和選擇列放入$responses數組中,並在生成表單部分訪問它們而無需重命名它們嗎?在這一點上,我覺得我需要重新命名。任何幫助將不勝感激!

+0

你到底在問什麼?看起來你正在用'$ choices'向正確的方向前進。 –

+0

我在區分4種不同選擇時遇到了問題。如果我將它們從表格中拉出來,並將它們粘貼到$迴應數組中,我無法想出區分差異的方法。所以,我認爲我需要在將它們推入$迴應數組之前改變它們的標題。不確定我將如何做... – Abundnce10

+2

而不是發明自己的方式來顯示架構,使用標準的SQL語句。除了遵循一個衆所周知的標準之外,你的[示例](http://sscce.org/)將是獨立的。而不是直接將值插入到語句中,而是使用準備好的語句,這些語句在重複查詢時更安全,更高效。不要使用'
'來佈置表單,使用CSS(或者一個列表元素,這可能是語義的)。您的生產代碼是否缺少單引號代表? – outis

回答

0

選擇表格,通過 一個MySQL查詢獲取選項出問題選項,使行變量,然後回顯它們。

3

我希望我能正確理解你的問題。看起來好像你要求給出你的數據結構,你將如何向用戶表示選擇。

比方說,你的選擇數據的特定問題#27801看起來像這樣在你的question_choice表:

choice_id question_id is_correct_choice choice 
1   27801   0     Blue 
2   27801   0     Green 
3   27801   1     Red 
4   27801   0     Shoe 

你已經符號化的數據後,可以輸出一組的選擇,因爲有一個單選按鈕組該question_id作爲組名稱的一部分,而choice_id爲單個值:

<input type="radio" name="27801" value="1" /> Blue <br /> 
<input type="radio" name="27801" value="2" /> Green <br /> 
<input type="radio" name="27801" value="3" /> Red <br /> 
<input type="radio" name="27801" value="4" /> Shoe <br /> 

然後當測驗已經提交,您可以通過每一個選擇迭代尋找在t確定$correct_choice_num他的價值爲is_correct_choice。如果您將corrent_choice_num存儲在您的數據庫中,則可以避免必須執行此迭代,但這可能意味着再有一個表。

無論如何,一旦您的腳本有$correct_choice_num,您可以將其與用戶選擇的選擇進行比較。

if ($correct_choice_num == $_POST["$question_id"]) 
{ 
    // This was the correct choice, do something 
} 

(做評價服務器端的好處是,用戶不能欺騙通過查看HTML文檔的源找到正確的選擇)

這只是一個例子,讓你開始。希望有所幫助!