2012-05-24 57 views
0

我已經搜索過但無法獲得有關此問題的解決方案。從多維數組中獲取HTML值並使用PHP計算值

我正在處理的應用程序將生成未知數量的項目,並讓用戶從每個項目的下拉列表中選擇數量。例如。

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所有選定的項目嗎?

這是我曾嘗試:如果你想總的所有itens的,或總每個項目的

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; 
+1

無論你做什麼,[確保數量不是浮點值](http://stackoverflow.com/a/1470625/473637)。 – Jeshurun

+0

是的。請牢記這一點。任何幫助?請。 –

+0

不是未知的但我認爲可變。所以你可以得到'item_price'的值,也可以參見['array_values'](http://php.net/array_values)。 – hakre

回答

2

我建議不要把收費和價格進入形式和宣讀過POST請求。 有些人做不好的東西,如html注射或post parameter manipulation。您可以使用操作的POST參數向您發送自己的價格和費用請求。

最簡單的方法是使用firefox打開你的頁面,並使用螢火蟲操作價格[]和費用[]的值,然後按提交 - 即使輸入只讀!

我的小費 - 這樣做:

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

其中唯一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 
} 

我希望這會幫助你。

+0

謝謝佩德羅。這看起來很穩固。請問我該如何打印所有選定的項目及其各自的價格和費用,以及總計?也就是說,如果用戶選擇n(項目)中的2,我將打印2 * n(項目),因爲我想將每個項目存儲在單位中。如將2個數量作爲單獨項目處理。請參閱http://stackoverflow.com/questions/10762618/mysql-database-design-structure我想使用選項2 –

+0

Pedro我做了print_r($ uniqueId),但它顯示一個空白頁。 –

+0

我不知道你的完整代碼... –

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[]">

1
  1. 首先,不包括雙引號字符串 單引號,當你引用數組,你可能有一個「encapsed 字符串」的錯誤。
  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. 你可能使用一個TABLE而不是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; 

} 

我也同意,其價格在您的直接表現形式反正可能導致數據被篡改,那建議你到用戶檢查數據庫已經給出了非常明智的建議。

+1

「按照最佳做法,用/>關閉選項標記。」它真的取決於文檔類型。 XHTML需要/>。 HTML 4不允許它。 HTML 5允許它作爲可選項。 –

+0

你是對的,但你可能會同意我的觀點,即遵循XHTML要求,即使不是強制性的,也會導致更多可讀和可調試的HTML(特別是在大頁面,複雜佈局中)。這就是爲什麼我提出了一個「最佳實踐」,順便說一下,而不是「你必須」。這就是說,你的觀察是100%正確和有用的壓力:) – Cranio

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}] 

我測試了它,並正在完善。希望這會有所幫助:)