【问题标题】:Troubled with making a PHP db driven multiple choice Quiz在制作 PHP 数据库驱动的多项选择测验时遇到了麻烦
【发布时间】:2012-03-12 21:21:43
【问题描述】:

所以我的目标听起来很简单,我需要做一个数据库驱动的多项选择测验 CMS 添加到我的项目中。我需要能够按类别创建测验,每个测验添加 10 个问题,以及 4 个问题和 1 个答案。我在两个方面遇到了麻烦。

  1. 数据库结构。如何构建我的数据库以便我可以做到这一点?例如,每个问题、question_answers 和测验的表格?

  2. 用户完成测验后,我想获取分数并将其存储到自己的表中。我知道如何将分数存入数据库,但我将如何显示测验、相应的问题、相应的答案以及正确的答案以及右侧的单选按钮?

这对我来说很棘手,但对你们中的一些天才来说可能不是。

最好的问候,

肖恩

【问题讨论】:

  • 你试过什么? Stack Overflow 是为开发人员创建的,以获取非常具体问题的答案。您的问题听起来就像您只是希望有人为您编写所有代码。
  • Sean - 您应该提供迄今为止尝试过的示例代码,并解决您遇到的重大问题和问题。不要指望有人为您完成工作并给出完整的解决方案。
  • 我根本不希望有人为我编写代码。例如,我需要知道的只是我的问题的细分。我的回答几乎不需要任何代码。问题是想出问题。在我知道我将如何去做之前,我通常不会编写代码。让我举个例子。 Sean - 对于第一部分,您可以通过 ______ 组合两个表。从长远来看,它可以节省您的时间并且更容易。

标签: php mysql


【解决方案1】:

为您单击了此表结构。外键约束是可选的。

CREATE TABLE IF NOT EXISTS `answer` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `question_id` int(10) unsigned NOT NULL,
  `answer` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `question_id` (`question_id`)
) ENGINE=InnoDB ;

CREATE TABLE IF NOT EXISTS `question` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `quiz_id` int(10) unsigned NOT NULL,
  `question` varchar(500) NOT NULL,
  `correct_anwer_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `quiz_id` (`quiz_id`,`correct_anwer_id`),
  KEY `correct_anwer_id` (`correct_anwer_id`)
) ENGINE=InnoDB ;

CREATE TABLE IF NOT EXISTS `quiz` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `category` int(10) unsigned NOT NULL,
  `title` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB ;

ALTER TABLE `answer`
  ADD CONSTRAINT `answer_ibfk_1` FOREIGN KEY (`question_id`) REFERENCES `question` (`id`);

ALTER TABLE `question`
  ADD CONSTRAINT `question_ibfk_2` FOREIGN KEY (`correct_anwer_id`) REFERENCES `answer` (`id`),
  ADD CONSTRAINT `question_ibfk_1` FOREIGN KEY (`quiz_id`) REFERENCES `quiz` (`id`);

为了存储测试,用户已经采取了:

CREATE TABLE IF NOT EXISTS `test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  `quiz_id` int(10) unsigned NOT NULL,
  `date_taken` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `score` mediumint(9) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `quiz_id` (`quiz_id`)
) ENGINE=InnoDB ;

CREATE TABLE IF NOT EXISTS `test_answer` (
  `test_id` int(10) unsigned NOT NULL,
  `question_id` int(10) unsigned NOT NULL,
  `answer_id` int(10) unsigned NOT NULL,
  `single_score` mediumint(9) NOT NULL,
  PRIMARY KEY (`test_id`,`question_id`),
  KEY `question_id` (`question_id`),
  KEY `answer_id` (`answer_id`)
) ENGINE=InnoDB ;

ALTER TABLE `test`
  ADD CONSTRAINT `test_ibfk_1` FOREIGN KEY (`quiz_id`) REFERENCES `quiz` (`id`);

ALTER TABLE `test_answer`
  ADD CONSTRAINT `test_answer_ibfk_3` FOREIGN KEY (`answer_id`) REFERENCES `answer` (`id`),
  ADD CONSTRAINT `test_answer_ibfk_1` FOREIGN KEY (`test_id`) REFERENCES `test` (`id`),
  ADD CONSTRAINT `test_answer_ibfk_2` FOREIGN KEY (`question_id`) REFERENCES `question` (`id`);

一些示例数据可供使用:

INSERT INTO `answer` (`id`, `question_id`, `answer`) VALUES
(3, 1, 'stackoverflow.com '),
(4, 1, 'example.com');

INSERT INTO `question` (`id`, `quiz_id`, `question`, `correct_anwer_id`) VALUES
(6, 1, 'What is the best website on the whole internet?', 3);

INSERT INTO `quiz` (`id`, `category`, `title`) VALUES
(1, 1337, 'My Great Quiz. Take me!');

【讨论】:

  • 这就是我的想法。现在,当用户回答问题时,我是否可以通过将收音机与答案表进行比较来查看他是否有正确的答案?
  • 正确答案保存在question.correct_answer_id列中作为参考。由于每个问题只有一个正确答案(我的假设),因此我将其存储在question 表中。
  • 谢谢!我想我现在明白了
猜你喜欢
  • 1970-01-01
  • 2022-01-05
  • 2011-08-28
  • 1970-01-01
  • 2016-06-29
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
相关资源
最近更新 更多