嵌套的foreach循环具有多对多的关系

时间:2010-02-10 16:47:35

标签: php mysql html

我使用名为groupparty的查找表,在多对多关系中有两个表(组和派对)。我希望能够为每一方分配价格,以便属于两个组的一方可能在一个组中具有一个价格而在另一个组中具有不同的价格。在表格中,我有三列:groupid,partyid和totalprice。所以,为了分配价格,我有以下形式:

<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);
  }
 }

欢迎任何建议。感谢。

1 个答案:

答案 0 :(得分:3)

您可以调整结构以使更新变得更加轻松 - 只需将组ID作为键传递到HTML中的totalprices[]数组:

<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

当你真正想要这个时:

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

从上表中可以看出,所有组都得到了价格30,因为这是每个组得到的最后价格。