我已经搜索过但无法解决此问题。
我正在处理一个应用程序,该应用程序将生成未知数量的项目,并让用户从每个项目的下拉列表中选择数量。例如
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;
答案 0 :(得分:2)
我建议不要在表格中加入费用和价格,并在POST请求中阅读。 有些人会做一些不好的事情,比如html注入或post parameter manipulation。您可以使用操作的POST参数向他们发送具有自己的价格和费用的请求。
最简单的方法是使用firefox打开你的页面并使用firebug操纵price []和费用[]的值,然后按提交 - 即使输入只是readonly !!!
我的提示 - 做类似的事情:
<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
}
我希望这会对你有所帮助。
答案 1 :(得分:1)
"item_qty"
中添加双引号字符串
可能会导致错误。option
关闭/>
代码。LABEL
代码未正确使用。正确的语法是:<label for='html_element_id'>My pretty label</label> <input id='html_element_id ... (my form control) ... />
并且除了复选框或无线电之外,它与其他控件相比毫无用处(尽管总是更加语义和结构化)。TABLE
代替P
代码进行协同工作
一切都排好了。更好,你可以用CSS来排队,
更好的做法。如果您对选择进行硬编码,则可能难以处理
需求变更:如果您需要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;
}
我也同意,以您的形式直接表示价格可能导致数据篡改,建议您检查数据库的用户提供了非常明智的建议。
答案 2 :(得分: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[]">
答案 3 :(得分: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}]
我测试了它并且工作得很完美。希望这有助于:)