Php 在调查系统中按顺序对问题进行排序

Php 在调查系统中按顺序对问题进行排序,php,mysql,pdo,Php,Mysql,Pdo,我正在使用PDO/MySQL和PHP为我所在大学的一位教授构建一个调查系统。我有一个问题表,该表中有大量信息,包括question\u id、question、enabled和顺序。创建调查时,所有问题idenabled=1都将内爆为字符串,并存储在单独的调查表中。将来编辑问题时,系统只需禁用旧问题并将新版本添加到表的末尾,并使用适当的顺序值更新所有内容,从而允许旧调查仍以原始状态查看 我正在努力找出如何最好地处理这方面的订购。如果我在数据库中为问题id存储了一个字符串(例如,我的字符串将是2,

我正在使用PDO/MySQL和PHP为我所在大学的一位教授构建一个调查系统。我有一个问题表,该表中有大量信息,包括
question\u id
question
enabled
顺序
。创建调查时,所有
问题id
enabled=1都将内爆为字符串,并存储在单独的
调查
表中。将来编辑问题时,系统只需禁用旧问题并将新版本添加到表的末尾,并使用适当的
顺序值更新所有内容,从而允许旧调查仍以原始状态查看

我正在努力找出如何最好地处理这方面的订购。如果我在数据库中为
问题id
存储了一个字符串(例如,我的字符串将是
2,3,5,6,9,4,1
),我可以很容易地显示输出数据——我可以使用
explode()
,然后迭代该数组的默认0索引,依次调用每个问题。如何以正确的顺序存储这些值?

只需去掉
“所有问题ID都内爆成字符串并存储在单独的调查表中”
部分,因为这是无用和错误的

所以,每次您需要按顺序排列问题ID时,只需从问题表中选择它们,按
order
字段排序即可

不要无缘无故地把事情复杂化。你会让你的生活更轻松。
我的意思是一个真正的原因,而不是想象得到的原因。
当涉及到数据库设计时,这种规则可以以法律的形式制定:


我希望您有另一个表格,由
用户id
问题id
答案组成

通过内爆成字符串,您正在对数据进行非规范化处理。我建议不要这样做,尤其是在这种情况下。使用单独的表格管理问题和调查之间的链接

我觉得这有点奇怪,因为我还没有完全理解你想做什么。我认为你正在创建一个单一的在线调查——一个单一目的的调查,而不是创建大量无关调查的工具。因此,如果我的假设是正确的,我会制作更多的表格

TABLE Surveys (
SurveyId INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
SurveyTitle VARCHAR(100) NOT NULL,
SurveyDescription TEXT,
Owner VARCHAR(100),
BLAH BLAH BLAH
);

TABLE Questions (
QuestionId INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
Version INT UNSIGNED NOT NULL,
Question TEXT,
OrderNumber INT UNSIGNED,
Enabled ENUM('Yes', 'No') DEFAULT 'Yes'
);

TABLE SurveyQuestions (
SQId INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
SurveyId INT UNSIGNED NOT NULL,
QuestionId INT UNSIGNED NOT NULL,
Version INT UNSIGNED NOT NULL
);

TABLE QuestionHistory (
QuestionId INT UNSIGNED,  // notice we dont have a primary key i would probably do a composite key on QuestionId and Version
Version INT UNSIGNED NOT NULL,
Question TEXT,
OrderNumber INT UNSIGNED,
Enabled ENUM('Yes', 'No') DEFAULT 'Yes',
DateSuperceded DATETIME
);
您还需要一个表来显示受访者及其回答,回答可能会链接到SurveyQuestions表。在问题历史记录表上使用自动id也更好,但这取决于您到底想做什么


这是一个比我想发布的长得多的答案。如果我把问题弄糊涂了,而不是弄清楚了,我道歉。如果您想发布一个更详细的说明,说明您要创建的内容,那么我可以提供更好的建议。

但是我的方法不是更简单吗?我有一个单独的表,存储每个调查的所有信息,其中包含用户名、问题列表、开始日期、结束日期以及是否完成的列。我必须将信息存储在某个地方,以了解该人员在开始填写表单时遇到了哪些问题,因此,排序此问题列表不是最明智的选择吗?然后我只需要调用问题ID列表(仅此而已,只是一个数字列表)并循环显示每个问题的数据。我应该澄清一下,我的系统中确实有其他表,而不仅仅是我提到的两个表。我和一个真正知道自己在做什么的人一起工作。我有一个
答案
表(id、问题id、调查id、值),
问题
(与每个问题相关的所有数据),
调查
(包含已开始的每个调查的信息)和
用户
(所有用户相关信息)。我正在创建一个系统,以便只进行一次调查,并且对于不知道自己在做什么的人来说,这一次调查可以轻松编辑。我的方式似乎是管理问题的最简单方式……列表,而无需为问题列表创建一个完全独立的表——只需将问题ID解析为字符串,然后拉动该字符串并循环显示每个问题。做起来非常简单。需要比这更困难吗?(并不是说你错了,只是解释了我为什么使用这种方法。我对PHP还是个新手。)mysql是一种关系数据库——它擅长做什么,而且速度非常快。所以使用它。使用关系。或者非常简单,将数据库全部转储在一起,并将内容以串联字符串的形式存储在文本文件中。你的方法并不完全错误,只是走了一半。关系数据库解决了诸如更新问题或更改顺序等问题。我会认真阅读关系数据库。如果数据库结构正确,php就会变得简单得多。我甚至不知道关系数据库的概念存在,并且正在围绕这个概念编写代码。这需要更多的研究,我觉得到目前为止我的大部分工作都是白费力气。谢谢,我很感激!