【问题标题】:Generating HTML Form from database using PHP使用 PHP 从数据库生成 HTML 表单
【发布时间】:2011-11-23 07:52:17
【问题描述】:

我正在构建一个基本网站,该网站将提供从 MySQL 数据库动态生成的测验。根据我当前的数据库模式,我无法理解如何在 Quiz Web App 中为不同问题生成“选择”。

这是数据库架构:

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 和choice 列放入$responses 数组并在生成表单部分中访问它们而不重命名它们吗?在这一点上,我觉得我需要重命名。任何帮助将不胜感激!

【问题讨论】:

  • 您遇到的具体问题是什么?看来您正朝着正确的方向前进,$choices
  • 我无法区分这 4 种不同的选择。如果我将它们从表中拉出并将它们粘贴到 $responses 数组中,我无法想出一种区分差异的方法。所以,我认为我需要在将它们推入 $responses 数组之前更改它们的标题。不知道我将如何做到这一点......
  • 不要发明自己的模式显示方式,而是使用标准 SQL 语句。除了遵循众所周知的标准之外,您的example 将是独立的。与其将值直接插入到语句中,不如使用准备好的语句,这样在重复查询时更安全、性能更高。不要使用 &lt;br/&gt; 来布置表单,使用 CSS(或列表元素,这将是语义)。缺少的单引号是否代表您的生产代码?

标签: php mysql html sql forms


【解决方案1】:

希望我能正确理解您的问题。鉴于您的数据结构,您似乎在问,您将如何向用户表示选择。

假设您针对特定问题 #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 />

然后在提交测验后,您可以通过遍历每个选项查看is_correct_choice 的值来确定$correct_choice_num。如果您将 corrent_choice_num 存储在数据库中,您可以避免执行此迭代,但这可能意味着需要多一张表。

无论如何,一旦您的脚本具有$correct_choice_num,您就可以将其与用户选择的选项进行比较。

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

(在服务器端进行评分的好处是用户无法通过查看 HTML 文档的源来欺骗以找到正确的选择)

这只是一个让您入门的示例。希望对您有所帮助!

【讨论】:

    【解决方案2】:

    选择表格,通过以下方式从 question_choice 中获取选项 一个 MySQL 查询,创建行变量,然后回显它们。

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-18
      • 2013-10-11
      • 1970-01-01
      相关资源
      最近更新 更多