jQuery & PHP:计算总和并将其发送回客户端

Posted

技术标签:

【中文标题】jQuery & PHP:计算总和并将其发送回客户端【英文标题】:jQuery & PHP: Calculate the sum and send it back to client 【发布时间】:2016-03-12 05:55:59 【问题描述】:

我有以下带有输入元素的 html 表单:

<form id="forma" name="forma" method="post">
   <div id="oblock">
      <div class="dtable">
        <div class="drow" id="drow1">
            <div class="dcell">
                <label for="aster">Aster:</label>
                <input type="text" id="aster" name="aster" value="0" stock="10" price="2.99" required>
            </div>
            <div class="dcell">
                <label for="daffodil">Daffodil:</label>
                <input type="text" id="daffodil" name="daffodil" value="0" stock="12" price="1.99" required >
            </div>
            <div class="dcell">
                <label for="rose">Rose:</label>
                <input type="text" id="rose" name="rose" value="0" stock="2" price="4.99" required>
            </div>
        </div>
    </div>
  </div>
  <div id="buttonDiv">
     <button type="submit">Place Order</button>
  </div>
</form>

我使用 jQuery serialize() 从表单收集数据并使用 $.post 发送到服务器端(在我的例子中为 test.php):

   $(function() 
        $("button").click(function(e) 
            var formData = $("form").serialize();
            $.post("test.php", formData, processServerResponse);
            e.preventDefault();
        );
    );
    function processServerResponse(data) 
         $("div.dcell").hide();
         $("#buttonDiv").append('<div>'+data.total+'</div>');
         $("#buttonDiv button").remove();
    

如果我理解正确 - var formData = $("form").serialize(); 发送到服务器的数据将是一个字符串,如下所示:

"aster":"2"&"daffodil":"5"&"rose":"0"

1.如何在PHP中访问这些值?

2.如果有大量输入元素,每个元素都有自己唯一的名称,我们如何迭代(并避免对每个元素单独使用 $_POST['input_name'] -> $_POST['aster'], $_POST['rose'] 等等...)并计算 PHP 中的总和?

3.如何将计算的总和发送回客户端(from PHP 到 jQuery/客户端)?

EDIT2:

根据我在这里收到的一些答案,我尝试了以下方式:

<?php
    $sum = 0;
    foreach ($_POST as $name=>$value) 
        $sum += (int)$value;
    
    $_POST['total'] = $sum;
    echo json_encode($_POST['total']);

我的客户端代码(jQuery):

function processServerResponse(data) 
        $("div.dcell").hide();
        $("#buttonDiv").append('<div>'+data+'</div>');
        $("#buttonDiv button").remove();
 

它有效 - 它显示总和......

【问题讨论】:

1.您可以使用超全局变量访问它们,使用元素名称作为键,如 $_POST['aster'] 关于您添加/更新的问题:将 value.total 更改为 data.total 已更改,我将显示 undefined 而不是 sum? 你能显示从你的 php 脚本返回的内容吗?请记住,当您使用 serialize() 时,只有输入元素值随请求一起发送。不是您添加的属性股票或价格 好的,我在您的 html 代码中看不到任何名称为 uneteVrednosti bur 的元素,您使用 isset($_POST['uneteVrednosti']) 在 php 代码中检查它。尝试将具有该名称的隐藏元素添加到您的表单中 【参考方案1】:

1 使用 $_POST['variable-name'];

$asterPostVariable = $_POST['aster'];

2 遍历 $_POST 数组

foreach ( $_POST as $key => $val )

  // Do calculation, your value from input element is in $val
  $sum += $val;
  // You could also check your $key if you don't want to sum all post variables

3 将其作为 json 数据回显

echo json_encode( ['sum' => $calculatedSum] );

编辑

2 遍历 $_POST 数组

foreach ( $_POST as $key => $val )

  // You could also check your $key if you don't want to sum all post variables. This solution is based on that your form elements that you want to calculate are named with the initial fl_
  if ( substr($key, 0, 3) == 'fl_' )
    $sum += $val;


【讨论】:

如果这个表单有更多的变量(与鲜花无关)发送到服务器端,但我们不想用它们来计算总和怎么办? 也许你可以用你想要总结的起始 fl_ 来命名所有输入元素。然后在您的 php 代码中检查元素名称的 $key 变量。 if (substr($key, 0, 3) == 'fl_')【参考方案2】:

回答所有三个问题:

1. 要访问这些值,您将使用超全局变量。例如:

$_POST['element_name'];

2.要遍历所有元素,请使用foreach 语句。例如:

$sum = 0;
foreach($_POST as $name => $value)
    $sum += strtoint($value);

$final = array(
    sum => $sum
);

3. 要将值返回到 javascript,请使用 json_encodeecho。还要确保不要echo 任何您不想返回的数据。例如:

echo json_encode($final);

【讨论】:

如果这个表单有更多的变量(与鲜花无关)发送到服务器端,但我们不想用它们来计算总和怎么办?【参考方案3】:

您可以将每个花变量作为数组的索引:

<form id="forma" name="forma" method="post">
   <div id="oblock">
      <div class="dtable">
        <div class="drow" id="drow1">
            <div class="dcell">
                <label for="flowers[aster]">Aster:</label>
                <input type="text" id="flowers[aster]" name="flowers[aster]" value="0" stock="10" price="2.99" required>
            </div>
            <div class="dcell">
                <label for="flowers[daffodil]">Daffodil:</label>
                <input type="text" id="flowers[daffodil]" name="flowers[daffodil]" value="0" stock="12" price="1.99" required >
            </div>
            <div class="dcell">
                <label for="flowers[rose]">Rose:</label>
                <input type="text" id="flowers[rose]" name="flowers[rose]" value="0" stock="2" price="4.99" required>
            </div>
        </div>
    </div>
  </div>
  <div id="buttonDiv">
     <button type="submit">Place Order</button>
  </div>
</form>

然后你可以遍历这个数组:

foreach($_POST['flowers'] as $flowerType => $count)
    // do something

我会尽量避免遍历$_POST 的整个数组,因为稍后您可能想在此表单中添加更多变量(与花无关)。

发回客户端时可以使用echo json_encode($result);

编辑

如果您的帖子收到 undefined 回复,您应该检查您的 PHP 错误日志,因为您的脚本很可能在回显任何内容之前失败或退出。

【讨论】:

从 PHP 5.4 开始,您还可以使用短数组语法,将 array() 替换为 []。 Source【参考方案4】:
    您不必从 jquery 序列化方法中反序列化 PHP 中的任何内容。如果您对数据进行序列化,如果您使用的是 GET 方法 ajax 请求,则应将其作为查询参数发送到 PHP;如果您使用的是 POST ajax 请求,则应将其作为查询参数发送到 PHP。因此,在 PHP 中,您可以根据请求类型访问 $_POST["varname"] 或 $_GET["varname"] 等值。

serialize 方法只是获取表单元素并将它们放入字符串形式。 "varname=val&var2=val2"

    迭代请求参数 $_REQUEST 或 $_POST。 将其转换为 json 并回显 ex。 echo json_encode($data);

【讨论】:

如果消失了怎么办? ***.com/questions/1792603/… 在您的答案中发布一个示例。 你只要拿出解决方案并从中学习,你是否希望答案永远存在? 是的,SO 希望保留答案。 那是你的问题 :) 很高兴我能帮上忙 给你我的朋友 :)

以上是关于jQuery & PHP:计算总和并将其发送回客户端的主要内容,如果未能解决你的问题,请参考以下文章

如何计算来自不同datagridview的每列总和之间的差异并将其显示在datagridview中

如何在PHP-jQuery中的DataTables中显示列的总和(其中所有值都是十进制值)?

如何计算表中一个字段的总和并将其放入输入中

JQuery:将数字相乘到单独的数组,然后得到结果的总和

如何计算 Map<> 中每个列表的总和?

c_cpp 该C程序使用指针计算数组元素的总和。程序使用指针遍历数组并将元素加起来