İç içe foreach birçok ilişki için bir çok ile döngüler

1 Cevap php

Ben groupparty adında bir arama tablosu kullanarak birçok ilişki için bir çok iki tablo (gruplar ve partiler) var. Ben iki gruba ait bir parti bir grup ve bir başka grupta farklı fiyat bir fiyat olabilir, öyle ki, her tarafa fiyatları atamak mümkün olmak istiyorum. Groupid, partyid ve TotalPrice: tablo groupparty, ben üç sütun var. Yani, fiyatlar atamak için, ben aşağıdaki formu vardır:

<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 tarafta, ben kadar aşağıdaki komut dosyası olarak geldim. Neredeyse tüm ilişkili gruplar halinde yukarıdaki forma girilen son TotalPrice değerini ekler dışında, çalışıyor. Başka TotalPrice değerleri kaybolur - Ben atanmış yalnızca tek bir değer ile sol kulüpler:

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

Herhangi bir öneriniz hoş olurdu. Teşekkürler.

1 Cevap

Sen güncellenmesi çok daha kolay yapmak için yapısını ayarlayabilirsiniz - sadece HTML totalprices[] dizisine bir anahtarı olarak grup kimliği geçmek:

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

Sonra bu bir dizi sayesinde sadece döngü yapabilirsiniz:

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

Geçerli yapısı ile sorun son yinelemenin ulaşıldığında her grup kimliği için, all fiyatlar aracılığıyla size döngü yani Açıkçası, son değer önceki yazılmadan olmasıdır.

. Eğer gruplar 1, 2 ve 3 ve fiyatları 20, 25 ve 30 olması göz önüne alındığında Sizin döngü şu anda bu gibi değerler üzerinden döngüler:

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

Aslında istediği zaman bu:

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

Eğer üst tablodan görebileceğiniz gibi olanların her biri olsun son fiyat olarak, tüm gruplar 30 fiyat olsun.