以下是我决定使用http://www.flickr.com/photos/michaelstitt/6077647604/in/photostream/的数据库设计the help from my previous post on Stack Overflow。
我正在尝试使用PHP和MySQL构建一个Quiz Web应用程序。构建HTML表单并手动编写“问题”和“question_choices”似乎要容易得多。但是,我想使用数据库中的数据填充表单。
所以,我的问题是您如何建议我从数据库中的表'问题'或'question_choices'中提取数据以填写HTML表单?
HTML表单看起来像这样:
<form method="post" action="quiz1.php">
<b>What was the make/model of my first car?</b>
<br>
<input type="radio" value="0" name="q_1">
Toyota Camry <br />
<input type="radio" value="1" name="q_1">
Honda Accord <br />
<input type="radio" value="0" name="q_1">
Ford Explorer <br />
<input type="radio" value="0" name="q_1">
Plymouth Voyager <br />
Honda Accord将来自表question_choices中的'choice'列。值=“1”将由'is_right_choice'列确定,并将填充user_question_answer表中的'is_right'列。 这看起来是个好主意吗?
非常感谢任何其他建议。提前谢谢。
答案 0 :(得分:1)
这不是一个好主意,因为任何查看HTML源代码的人都可以找出哪个是正确的答案。另一方面,您拥有架构中的所有信息来执行此服务器端(并保护答案)。
提问时间
我猜你(你不说)你想在一个页面上显示所有测验问题。您希望表单发布回默认的quiz.php
页面。 (<form method="post" action="quiz.php" />
)
由于quiz.php
可以处理任何测验,因此您需要在表单中嵌入测验ID,因此当您处理结果时,您可以看到正在回答哪个测验。试试<input type="hidden" name="quizid" value="1" />
(假设这是测验#1)。
您还需要明确说明您将问题从数据库中提取出来的顺序,因为他们正在从ID切换到订单(因此,如果您有10个问题的测验,第一个问题是ID 11,以ID 21结束,他们将成为问题1-10)。这可以通过SQL语句中的order by id
轻松处理。
问题的输出很好,无线电值应该是来自question_choices
的选择的ID ..所有值都是唯一的,并且从代码中不清楚是正确的答案。我建议将元素重命名为a_<#>
,因为当你处理时,它们实际上是你得到的答案(而不是问题),你可能想考虑围绕{{1}中的问题+选择}(为了便于阅读):
fieldset
在提交时我会验证所有问题至少选择了一个选项(除非答案也没有答案)......这样用户就不会意外地提交一半填写表格(按输入或者因为他们错过了一个问题)。
回答时间
所以<fieldset>
<b>What was the make/model of my first car?</b><br />
<input type="radio" value="214" name="a_1">Toyota Camry <br />
<input type="radio" value="215" name="a_1">Honda Accord <br />
<input type="radio" value="216" name="a_1">Ford Explorer <br />
<input type="radio" value="217" name="a_1">Plymouth Voyager <br />
</fieldset>
中的第一件事就是捕获quiz.php
并从数据库中加载相关问题和question_choices。
接下来迭代每个答案(1 - > n,其中n是问题的数量)并将这些值映射到$_POST["quizid"]
值。
比较每个答案的值:question.ID
(#= 1-n),找出用户选择的$_POST["a_#"]
ID - 可以直接插入question_choice
。
如果您还希望在该表格中存储user_question_answer
,则必须针对is_right
检查这些ID,以查看是否设置了question_choice
{您实际上是双重存储此数据,您可以通过从is_right_choice
移除is_right
来进一步规范化,因为您已经可以将答案(user_question_answer
)映射到choice_id
并检查答案是否正确}
你已经完成了!