设计好的 PHP 测验脚本 [关闭]

Posted

技术标签:

【中文标题】设计好的 PHP 测验脚本 [关闭]【英文标题】:Designing good PHP quiz script [closed] 【发布时间】:2010-07-05 18:00:27 【问题描述】:

我正在使用 phpmysql 为一所学校开发一个测验模块。要求很简单:

1) 有10个类别(科目)。

2) 从每个类别中随机选择 8 个问题,并一一显示。

3) 获取学生的意见。

4) 计算结果并显示出来。

现在,我面临的问题是如何使脚本尽可能高效。从某种意义上说是高效的,减少数据库点击次数。 我想将该特定用户的 80 个答案存储在 place 中,然后在数据库中一次更新它们。我不想使用cookies。我可以通过什么方式做到这一点?

有什么简单的 php 测验模块可以参考吗?

谢谢:)

【问题讨论】:

【参考方案1】:

从我个人的角度来看,如果有人要求我设计类似的东西,我会做以下事情:

如果我不想使用数据库资源,我会执行“开始测验之前”步骤,从数据库中获取我的问题 每个用户(即使没有注册)都有一个唯一的会话;从数据库中获取的数据会直接放在会话中(因为会话存储在服务器端,所以我不会关心加密它) 会话虽然有点问题,但是使用 cookie 和加密数据似乎比制作更长的会话更有效(也许学生需要一些时间来解决测验,而 5 分钟的会话会有点低,但是这不是什么大问题,你可以随意设置 答案也存储在会话中,最后您只需将会话中的结果与会话中的答案进行比较,这是一项非常基本的任务:如果结果存储在单独的数组中,您可以只需在每个答案上调用in_array()(数组是正确的结果)并增加一个变量以了解有多少问题被正确回答(如果每个问题都具有相同的“值”,则有效)

享受吧!

【讨论】:

【参考方案2】:

您显然想要一个快速缓存层。为此,我建议使用 memcached 或 APC。会话数据也可以工作。

也就是说,您最好为此使用全栈 PHP 框架。一个好的将为您管理缓存。我建议研究 symfony 或 CakePHP。

不过,真正的问题是:在确定确实存在 问题之前,您是否尝试提前解决这个问题?这是一个不好的方法。在尝试解决问题之前,请确保您遇到了问题。

【讨论】:

嗯..有点是的。但是我不想在完成所有模块后重新工作。 有点什么?您实际上是否遇到了您提出的数据库性能问题?在您真正遇到无法通过服务器端配置解决的性能问题之前,然后您应该添加一个缓存层。预先添加不必要的复杂性确实是个坏主意。 tl; dr:在你知道你真正拥有问题之前不要解决问题。这样做只会带来更多问题。 “真正的问题”+1。如果您正确地设计了您的应用程序,那么提高性能将不需要那么多工作,尤其是如果您使用了一个好的框架。始终在优化之前进行测量,否则您可能会优化错误的事物或错误的原因(例如,一开始就没有问题)。您的数据库服务器可能非常快,但您不知道:) 以下是您在设计测验模式时可以借鉴的一个简短示例:***.com/questions/429468/…【参考方案3】:

如果您必须一一显示,您需要将结果存储在某处,并且由于 http 是无状态的,您有 2 个选择:db 或 cookie。现在,在我看来,最好将答案存储在像这样的 var 中的 cookie 中

"a:1,b:2,question:answer,.."

然后在最后将它们炸开并检查结果。

【讨论】:

我不想使用 cookie,因为我在使用它时遇到了验证问题。如果我使用的是 DB,那么我认为它很昂贵。 如果规范化和正确索引应该不会很昂贵 您可以将问题存储在session 中(如您所知,它存储在服务器端)。如果您选择 cookie,请确保您加密存储在那里的数据(我知道我试图破坏所有学校系统)并且 cookie 将是我的第二个选择(在检查 html 以查看其中一个答案是否具有特定的“标记”之后) ; cookie 中的未加密数据就像现在(在世界杯期间)去约翰内斯堡,带着一个巨大的标志“我口袋里有 1,000,000 美元。请从我这里偷走它!” 是的..即使那是什么困扰我 您在设计它时有真正的问题吗?我的意思是,在我看来,如果谈论数据库查询中的成本,那么可以通过缓存来解决可伸缩性问题,但也许你想在硬件领域做点什么,因为单个服务器可能无法管理这么多客户端。我的意思是应该分析一个真实的场景并找到一个解决方案。你现在太抽象了。【参考方案4】:

你不应该这样。 webapp 将中间结果存储在数据库中是完全正常的。大多数应用程序每页执行多个数据库查询。

您可以使用sessions。这允许您存储与用户耦合的数据。但是,会话数据也存储在某处,因此效率并不是将其存储在会话而不是数据库中的理由。

【讨论】:

如果不是几百名学生参加考试,那么当成千上万名学生登录并参加考试时会发生什么。这不会影响数据库性能吗?我想尽可能地利用可用的小资源。 内存共享缓存是解决此类性能问题的可行方法,但我强烈怀疑该用户实际上还没有遇到此类问题。 创建您的程序。测试性能。通过分析确定热点。优化这些热点。一般来说,很难预测系统的哪一部分是瓶颈,过早优化弊大于利。【参考方案5】:

您想要做的是一种向导式的流程,每个页面上都有一个“下一步”按钮。对于此类事情,将结果存储在会话中是很常见的。

如果你将随机抽取的问题存储在会话中,像这样:

$_SESSION['questions'] = array(
    array(
        'question'    => 'What is the response to life ?', 
        'answer'      => '42', 
        'user_answer' => null,   // Will contain the user answer
        'answered'    => false), // Will be set to true once the question is answered
    array(
        'question'    => 'What is the color of the sky ?',
        'answer'      => 'blue',
        'user_answer' => null, 
        'answered'    => false)
);

然后您可以遍历问题,跟踪已回答的问题。

【讨论】:

以上是关于设计好的 PHP 测验脚本 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我需要在 php 文件测验中动态分配单选按钮

单身人士:好的设计还是拐杖? [关闭]

《数据结构》测验系统概要设计说明书

多人/单人测验游戏的数据库设计

测验8: 程序设计方法学 (第8周)-单选题

20172319 2018.04.11 《Java程序设计教程》第7周课堂测验(补写博客)