0

我已经搜索但无法解决这个问题。

我正在开发一个应用程序,它将生成未知数量的项目,并让用户从每个项目的下拉列表中选择数量。例如。

Item(s) | price | Select qty
Rice     23      3
Beans    22      4
Eggs     52      5

...
...
...
unknown

请问,我怎样才能在一个数组中捕获上述内容,并计算所有选定项目的总值和相应的费用?

我有以下 HTML 代码:

<form id='form1' name='form1' method='post' action='item_calc.php'>
<?php
    .....
while($t_row = mysql_fetch_assoc($get_items)) {

echo "<p><label>$t_row['$item_name']
<input type='text' READONLY name='item_price[]' value='$t_row['$item_price']' /></label>
<input type='text' READONLY name='item_fees[]' value='$t_row['$item_fee']' /> 
<select name="item_qty">
<option value="1">
<option value="2">
<option value="3">
<option value="4">
<option value="5">
</select>
</p><p>";

}

        echo "<label><input type='submit' name='submit'  value='Submit' /></label></p>
         </form>";

请问,我怎样才能获得所有选定项目的 item_price[] + item_fees[] * item_qty?

这是我尝试过的:

for ($i = 0; $i < count($_POST['item_price']); $i++) {
   // Do something here with $_POST['checkbx'][$i]



   foreach ($_POST['item_fees'] as $tkey => $tvalue) {
    //echo "Key: $tkey; Value: $tvalue<br>";
   }


   foreach ($_POST['item_price'] as $pkey => $pvalue) {
    //echo "Key: $pkey; Value: $pvalue<br>";
   }

   $total = $tvalue + $pvalue;


}
echo $total;
4

4 回答 4

2

我建议不要将费用和价格填入表格并从 POST 请求中读出。有些人会做一些坏事,比如 html 注入或后期参数操作。您使他们能够使用操纵的 POST 参数向您发送带有自己的价格和费用的请求。

最简单的方法是使用 firefox 打开您的页面并使用 firebug 操作 price[] 和 fee[] 的值,然后按提交 - 即使输入是只读的!

我的提示 - 执行以下操作:

<select name="quantity[unique-id]">
  <option value="null">choose...</option>
  ...your options...
</select>

其中 unique-id 是每个产品的唯一标识符,如数据库 ID。

然后在 php

foreach ($_POST['quantity'] as $uniqueId => $quantity) {
  //... don't forget to check $uniqueId and $quantity for injections (like sql injections)
  //skip the products with no numeric quantity value
  if (!is_int($quantity) || $quantity < 1) {
    continue;
  }
  $fee = getFeeFor($uniqueId); // from database?
  $price = getPriceFor($uniqueId); // from database?
  //... do what you want: $price + $fee * $quantity
}

我希望这能帮到您。

于 2012-05-26T22:54:50.790 回答
1
  1. 首先,当您引用数组时,不要在双引号字符串中包含单引号,您可能会遇到“封装字符串”错误。
  2. 您还包括一个双引号字符串,"item_qty"其中可能会导致错误。
  3. 关闭option标签/>作为最佳实践。
  4. 您的LABEL标签使用不当。正确的语法是:<label for='html_element_id'>My pretty label</label> <input id='html_element_id ... (my form control) ... />并且对于复选框或单选以外的其他控件,它非常无用(尽管总是更加语义化和结构化)。
  5. 您可以考虑使用 aTABLE而不是P标签来排列所有内容。更好的是,你可以使用 CSS 来排列东西,更好的做法。
  6. 如果您对选择进行硬编码,则可能难以处理需求更改:如果您需要从 1 到 10 的数量怎么办?如果您选择使用文本框而不是SELECT怎么办?

    while($t_row = mysql_fetch_assoc($get_items)) 
    {
        // Generate quantity string - can change the $qty string
        // for any imput method you like
    
        $qtyName = "item_qty[]";
    
        $qty = "<select name='" . $qtyName . "'>";
        for ($i=1; $i<6; $i++)
        {
            // close the option tag as best practice!
            $qty .= "<option value='" . $i . "' />";
        }
        $qty .= "</select>";
    
        echo sprintf("<p>%s
        <input type='text' READONLY name='item_price[]' value='%s' /></label>
        <input type='text' READONLY name='item_fees[]' value='$s' /> " . $qty . "</p>",
        $t_row['item_price'],
        $t_tow['item_fee']);
    }
    

收集数据很简单:

$sum = 0;
$fees = $_POST['item_fee'];
$qtys = $_POST['item_qty'];
$prices = $_POST['item_price'];
$total = count($prices);

for ($i = 0; $i<total; $i++)
{
    $item_fee = $fees[$i] + 0; // trick to filter only numerical values and avoid data tampering
    $item_price = $price[$i] + 0;
    $item_quantity = $qtys[$i] + 0;

    $item_total = $item_price + $item_fee * $item_quantity; 

    $sum += $item_total;

}

我也同意,在您的表单中直接表示价格无论如何都会导致数据篡改,建议您检查数据库的用户给出了非常明智的建议。

于 2012-05-28T09:11:59.720 回答
0
$total = 0;
$fee = $_POST['item_fee'];
$qty = $_POST['item_qty'];

foreach($_POST['item_price'] as $k => $price) {
    $total += $price + ($fee[$k] * $qty[$k];
}

不确定您是想要所有项目的总和,还是每个项目的总和。

如果想要每个项目的总数,请更改$total += $price + ($fee[$k] * $qty[$k];$total = $price + ($fee[$k] * $qty[$k];删除第一行 ( $total = 0;)。

更改<select name="item_qty"><select name="item_qty[]">

于 2012-05-26T22:39:43.657 回答
0

我有一个非常简单的解决方案。

首先更改<select name="item_qty"><select name="item_qty[]">

然后在你的item_calc.php,写这个

$itemprice = $_POST["item_price"];//tested with array(10,35,21)
$itemfees = $_POST["item_fees"];//tested with array(3,7,4)
$itemqty = $_POST["item_qty"];//tested with array(2,5,3)
$i = 0;
$total = 0;
foreach($itemprice as $price){
  $feesx = $itemfees[$i];
  $qtyx = $itemqty[$i];
  $calculated = ($price+$feesx)*$qtyx;
  $total = $total + $calculated;
  $i++;
}
echo $total;//echos 311 [{(10+3)*2}+{(37+7)*5}+{(21+4)*3}]

我对其进行了测试,并且运行良好。希望这可以帮助:)

于 2012-06-01T15:23:24.197 回答