2010-02-10 77 views
1

我有兩個表(組和派對)在多對多的關係中使用名爲groupparty的查找表。我希望能夠爲每一方分配價格,這樣屬於兩個組的一方可能在一個組中有一個價格,而在另一個組中有不同價格。在表groupparty中,我有三列:groupid,partyid和totalprice。所以,要分配價格,我有以下幾種形式:嵌套的foreach循環與多對多的關係

<form action="" method="post"> 
<?php foreach ($groups as $group): ?> 
<input type="hidden" name="groupids[]" 
     value="<?php echo $group['id']; ?>"/> 
<?php htmlout($group['groupname']); ?> 
<label for="totalprice">Price: 
<input type="text" name="totalprices[]" id="totalprice" 
     value="<?php htmlout($totalprice); ?>"/></label><br /> 
<?php endforeach; ?> 
<input type="hidden" name="id" value="<?php htmlout($id); ?>"/> 
<input type="submit" name="action" value="Set"/> 
</form> 

在mysql方面,我已經走到了以下腳本。它幾乎可行,除了它將上面輸入的最後一個總價格值插入到所有關聯的組中。任何其他總價值都會丟失 - 我剩下的只有一個值:

if (isset($_POST['action']) and $_POST['action'] == 'Set') 
{ 
    include $_SERVER['DOCUMENT_ROOT'] . '/includes/connect.inc.php'; 
    $id = mysqli_real_escape_string($link, $_POST['id']); 

    foreach($_POST['groupids'] as $groupid) 
    foreach($_POST['totalprices'] as $totalprice) 
    { 
    $sql = "UPDATE groupparty SET 
    totalprice = '$totalprice' 
    WHERE groupid = '$groupid' 
    AND partyid = '$id'"; 
    mysqli_query($link, $sql); 
    } 
} 

任何建議都會受到歡迎。謝謝。

+0

HTML看起來像什麼產生? (來自瀏覽器的實際輸出) – 2010-02-10 16:52:18

+0

如果一方屬於例如兩個組,則將有兩行與1)該組的名稱,然後2)用於輸入價格值的文本輸入字段。 – PeterC 2010-02-10 16:54:24

回答

3

您可以調整結構,使更新更容易–只是通過組ID作爲關鍵totalprices[]陣列在你的HTML:

<form action="" method="post"> 
    <?php foreach ($groups as $group): ?> 
     <?php echo($group['groupname']); ?> 
     <label for="totalprice">Price:</label> 
      <input type="text" name="totalprices[<?php echo $group['id']; ?>]" id="totalprice" value="<?php echo($totalprice); ?>"/></label><br /> 
    <?php endforeach; ?> 
    <input type="hidden" name="id" value="<?php htmlout($id); ?>"/> 
    <input type="submit" name="action" value="Set"/> 
</form> 

然後,你可以通過一個數組循環:

if (isset($_POST['action']) and $_POST['action'] == 'Set') 
{ 
    include $_SERVER['DOCUMENT_ROOT'] . '/includes/connect.inc.php'; 
    $id = mysqli_real_escape_string($link, $_POST['id']); 

    foreach($_POST['totalprices'] as $groupid => $totalprice) 
    { 
     // Remember to also escape these 
     $groupid = mysqli_real_escape_string($link, $groupid); 
     $totalprice = mysqli_real_escape_string($link, $totalprice); 

     $sql = "UPDATE 
        groupparty 
       SET 
        totalprice = '$totalprice' 
       WHERE 
        groupid = '$groupid' 
       AND 
        partyid = '$id'"; 

     mysqli_query($link, $sql); 
    } 
} 

與當前的結構問題是,對於每個組ID,您遍歷價格的所有,所以很明顯是達到了最後一次迭代時,最後一個值正在覆蓋以前。

假設你有1組,2和3,價格20,25和30你的循環目前通過這樣的循環值:

Group Price 
1  20 
1  25 
1  30 # This is the last price Group 1 gets 
2  20 
2  25 
2  30 # This is the last price Group 2 gets 
3  20 
3  25 
3  30 # This is the last price Group 3 gets 

當你真正想要的是:

​​

正如您從上表中看到的,所有組獲得價格30,因爲這是每個人獲得的最後一個價格。

+0

謝謝你,Tatu - 這是非常有幫助和清晰的。 (在stackoverflow上學習編程很有趣!)再次感謝。 – PeterC 2010-02-10 17:30:02