【问题标题】:HTML form calculation - JS or PHP? (multiple variables)HTML 表单计算 - JS 还是 PHP? (多个变量)
【发布时间】:2018-07-03 18:22:22
【问题描述】:

我正在构建一个测验。示例 HTML:

<div class="panel qContainer">
    <ol id="left">
        <li>
            Question1:<br/>
            <input type="radio" value="1A" name="SortingQ1" />1A
            <input type="radio" value="1B" name="SortingQ1" />1B
            <input type="radio" value="1C" name="SortingQ1" />1C
        </li>
        <li>
            Question2:<br/>
            <input type="radio" value="2A" name="SortingQ2" />2A
            <input type="radio" value="2B" name="SortingQ2" />2B
            <input type="radio" value="2C" name="SortingQ2" />2C
            <input type="radio" value="2D" name="SortingQ2" />2D
            <input type="radio" value="2E" name="SortingQ2" />2E
        </li>
    </ol>
    <input type="button" id="button" value="submit" />
</div>

计算结果有5个变量:sL、sK、sA、sG、sB。 每个答案都为这些变量赋予数值。例子: 1A = sL+4, sK+1, sA+2, sG+5, sB+3

提交后,所有的值都应该相加,最大的变量将作为结果返回。

我的问题是:

  • 如何正确调用计算/提交值的动作?

  • 如何只取选定的输入值?

  • 如何计算结果?

关于结果,我认为最简单的方法是使用简单的 IF 语句:

$x = ''; //value from input, not sure how to initialise it
if ($x == '1A'){
    $sL=+4;
    $sK=+1;
    $sA=+2;
    $sG=+5;
    $sB=+3;
}

当然,我不确定PHP是否有这样的计算逻辑。也许Javascript会更容易?至少自己做计算。使用 JS 非常简单。我正在考虑使用 PHP,因为结果将应用于用户数据库字段。

欢迎提出任何建议!

如果您有任何问题,请告诉我。 (此表单将在phpBB环境中使用)

这是我的想法的一个简单示例: 测验你是什么动物?

可能的结果:R1 = 狮子; R2 = 企鹅;

问题 1 是:“你吃肉吗?”

1A - 是(R1=+1;R2=+0);

1B - 否(R1=+0;R2=+1);

问题 2 会是:“你喜欢冷还是热?”

2A - 冷(R1=+0;R2=+1);

2B - 热量(R1=+1;R2=+0);

答案变量被求和后,返回总和更高的结果(狮子或企鹅)

【问题讨论】:

  • 如果您使用 JS,有人可以随时更改计算。尽管在这种情况下这似乎没什么大不了的。你可以用 JS 或 PHP 来做。
  • 通过 JS 它将是动态的,即不需要重新加载页面。使用 PHP,您必须先提交表单,然后由服务器(而不是客户端)完成计算。
  • 你好@prodigitalson,是的,你是对的。安全不是最大的问题。我正在寻找最精简的方式来做到这一点,没有不必要的负载和资源使用。但是我对 PHP 很陌生,所以不知道如何做这样简单的事情,比如取这样的值和做这样的计算。我想一切都会被放入数组(答案数组,用户输入数组)中,然后使用 FOR 答案数组将与用户输入数组进行比较并向结果变量添加适当的值。然而如何用 PHP 做这样的计算呢?
  • 你好@Qirel,好吧,在这种情况下,结果将应用于用户数据库,并根据结果进行一些更改,所以我不介意页面重新加载。这实际上是一件好事。页面重新加载问题将被隐藏,只有答案可用。

标签: javascript php html forms sum


【解决方案1】:

如何正确调用计算/提交值的动作?

form 将极大地帮助处理数据服务器端。所以我假设你想计算submit

This MDN documentation describes sending form data。您将看到如何通过工具查看request 对象并以编程方式在服务器端访问它。


如何只取选定的输入值?

上面已经处理好了。


如何计算结果? ... 示例:1A = sL+4, sK+1, sA+2, sG+5, sB+3

这个例子对我来说毫无意义。描述性变量名称可能会有所帮助。

问答作为数据结构。现在考虑一下,不要重写所有内容!

比方说,如果问题/答案在一个数组中,那么所有这些都可以消失。那就去看看答案吧。

我将断言数据结构在任何地方都可以简化您的所有代码这一普遍真理。它在客户端和服务器端都很容易使用。我毫不怀疑它可以帮助解决这个难以理解的计算。结构是一种一致的“形式”,它将帮助从 UI 页面来回获取数据到数据库。它消除了整个地方的许多损失变量。它减少了冗余变量。使用数据结构时,函数更简单。

它会是什么样子?使用数组、对象等将属于一起的事物分组。没有正确的答案。通常存在反映对象关系的结构嵌套。有时事物是结构化的(分组的),因为它们相互作用。

var aQuestion = { 
   question : "question one",
   answers : [ 'ans1', 'ans2', 'ans3'],
   correct : 0    // index into answers array
   };

var twentyQuestions = [
   { 
   question : "question one",
   answers : [ 'ans1', 'ans2', 'ans3'],
   correct : 0    // index into answers array
   },

   { 
   question : "question two",
   answers : [ 'ans1', 'ans2', 'ans3'],
   correct : 2    // index into answers array
   }

   // ... and so on.
];

【讨论】:

  • 感谢您提供的示例!我之前在考虑使用 FORM,但不确定这是否是最好的方法。现在,进入我的结构。想象一下:结果是从 5 个变量(R1、R2、R3、R4、R5)中选择的。每个问题都有一个可用的答案。一个答案将值添加到每个结果变量中,因此:1A = R1+4, R2+1, R3+2, R4+5, R5+3 这就是 1 个问题答案 A 将添加到结果变量中的内容。答案 B 将添加这些值:1B = R1+1, R2+3, R3+4, R4+2, R5+5。让我知道现在这是否更有意义。和最大的结果变量是最终结果。
  • 所以有 5 个“类别”,每个问题,如果回答正确,就会为每个类别添加一个给定的数量,是吗?那么每个问题的数量不同?将这些保存在一个结构中并查找它们!但是 R1、R2 等是什么意思?有意义的变量名怎么样?这将有助于我们理解。
  • 好吧,没有“正确”的答案。您可以将此与诸如“您是什么超级英雄?,您是什么动物?,...”之类的在线测验进行比较。举一个非常简单的例子:你是什么动物?。可能的结果:R1 = 狮子; R2 = 企鹅; 问题 1 会是:“你吃肉吗?” 1A - 是(R1=+1;R2=+0); 1B - 否 (R1=+0; R2=+1); 问题 2 会是:“你喜欢冷还是热?” 2A - 冷 (R1=+0; R2=+1); 2B - 热量 (R1=+1; R2=+0);让我知道现在是否更有意义,
  • 嗯。所以你不是在问“你是什么动物?”你问的是间接的问题,比如“你吃肉吗?”来确定动物是什么。所以每个间接问题的答案都是加权的?我试图了解如何将所有这些抽象化——例如一组结果——因此可以编写简单地迭代结构(数组)的通用函数;因此函数更少、更简单、更短、可重用。
  • .... 如果我是正确的,上面,那么我会说是一致的,所有问题都有 5 个变量(或任何最大数量)。在“你吃肉吗?”的情况下只有 2 重要(是/否),所以变量 3 到 5 得到 +0。关键是要创建概念 - 抽象 - 看起来相同,行为相同,以便所有事情都以相同的方式处理。因此,代码将保持简单,不会像@Emeeus comment rightly states 那样失控
【解决方案2】:

假设您要使用 javascript:

  • 如何正确调用计算/提交值的动作?

您向按钮添加事件侦听器:

document.getElementById("button").addEventListener("click", function(){
//code here
});
  • 如何只取选定的输入值?

一种可能性是:

var question1 = document.getElementsByName('SortingQ1');
for (var i = 0; i<=question1.length; i++) {
    if (question1[i].checked) {
    //question1[i] is the answer 
        break;
    }
}
  • 如何计算结果?

这里是一个例子:

var optionsSelected = document.getElementsByClassName('option');

var submit = document.getElementById("button").addEventListener("click", function() {

  var param = {};
  param.sL = 0;
  param.sK = 0;
  param.sA = 0;
  param.sG = 0;
  param.sB = 0;

  var calSum = {};
  calSum['1A'] = [4, 1, 2, 5, 3];
  calSum['1B'] = [3, 2, 3, 4, 2];
  calSum['1C'] = [20, 30, 40, 330, 10];
  calSum['2A'] = [1, 4, 5, 5, 0];
  calSum['2B'] = [0, 5, 6, 5, 0];
  calSum['2C'] = [5, 6, 7, 0, 0];
  calSum['2D'] = [6, 7, 8, 0, 3];
  calSum['2E'] = [70, 80, 90, 100, 30];

  var max = 0;
  var par = "";
  for (var i = 0; i < optionsSelected.length; i++) {
    if (optionsSelected[i].checked) {
      let j = 0;
      for (let key in param) {
        param[key] += calSum[optionsSelected[i].value][j];
        j++;
        if (param[key] > max) {
          max = param[key];
          par = key;
        }
      }

    }
  }

  console.log(param);
  alert("max " + max);
  alert("max param " + par);

});
<div class="panel qContainer">
    <ol id="left">
        <li>
            Question1:<br/>
            <input type="radio" value="1A" name="SortingQ1" class="option" />1A
            <input type="radio" value="1B" name="SortingQ1" class="option"/>1B
            <input type="radio" value="1C" name="SortingQ1" class="option"/>1C
        </li>
        <li>
            Question2:<br/>
            <input type="radio" value="2A" name="SortingQ2" class="option"/>2A
            <input type="radio" value="2B" name="SortingQ2" class="option"/>2B
            <input type="radio" value="2C" name="SortingQ2" class="option"/>2C
            <input type="radio" value="2D" name="SortingQ2" class="option"/>2D
            <input type="radio" value="2E" name="SortingQ2" class="option"/>2E
        </li>
    </ol>
    <input type="button" id="button" value="submit" />
</div>

【讨论】:

  • 感谢您提供的示例!我对这部分有点困惑:for (var i = 0; i&lt;=question1.length; i++) { if (question1[i].checked) { IF 这里会为每个 question1 变量做同样的事情。所以我认为这不会正常工作,除非我误解了。问题是,每个变量都会为结果变量添加不同的数值。总和最大的结果变量将作为结果返回。
  • @KamiSama 您根据用户给出的响应进行计算。如果用户选择一个特定的,则计算其他选项。但这取决于实现。
  • @kamiSama 运行 jsfiddle,我猜计算是 1,2 或 3 你应该把你的公式放在那里。
  • @KamiSama 在 calSumQ1[A1] 中输入 A1 的公式,在 calSumQ1[A2] 中输入 A2 的公式,依此类推
  • 我觉得你误会了我。第一个答案是 1A = sL+4, sK+1, sA+2, sG+5, sB+3,第二个答案是 1B = sL+1, sK+3, sA+4, sG+2, sB+5你看?那就是我的意思。在您的示例中,一个答案有一个变量。就我而言,一个答案有 5 个变量。
猜你喜欢
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多