Birden fazla onay kutusundan $ _POST kazanın


159

Birden fazla onay kutuları (her kodu ile) ile 1 formu var:

<input type="checkbox" name="check_list" value="<? echo $row['Report ID'] ?>">

$row['Report ID']Veritabanında birincil anahtar nerede -yani her değer farklıdır.

Hangi onay kutularının işaretlendiğini nasıl anlayabilirim? (Belki birden fazla)

Bu bir gelen kutusu sistemi içindir ve aşağıda (tıklandığında) $row['Report ID']onay kutusunun işaretli olduğu tüm iletileri (kimlikleri:) silmek istediğim bir düğme var.

Yanıtlar:


334

Formdaki adı olarak ayarlayın ve check_list[]tüm onay kutularına dizi ( $_POST['check_list'][]) olarak erişebileceksiniz .

İşte istendiği gibi küçük bir örnek:

<form action="test.php" method="post">
    <input type="checkbox" name="check_list[]" value="value 1">
    <input type="checkbox" name="check_list[]" value="value 2">
    <input type="checkbox" name="check_list[]" value="value 3">
    <input type="checkbox" name="check_list[]" value="value 4">
    <input type="checkbox" name="check_list[]" value="value 5">
    <input type="submit" />
</form>
<?php
if(!empty($_POST['check_list'])) {
    foreach($_POST['check_list'] as $check) {
            echo $check; //echoes the value set in the HTML form for each checked checkbox.
                         //so, if I were to check 1, 3, and 5 it would echo value 1, value 3, value 5.
                         //in your case, it would echo whatever $row['Report ID'] is equivalent to.
    }
}
?>

4
Bana echo (ing) one check_list [] onay kutusu örneği verebilir misiniz? (Ve seçilen iki kişi için benzer olur mu?) Teşekkürler.
James Andrew

2
Ayrıca HTML'de herhangi bir değer ayarlanmadığı $checktakdirde eşit olacağını belirtmeliyim on.
Sean Walsh

9
if($_POST)- yararsız, $_POSTher zaman doğru olacak. Bunun !empty($_POST['check_list'])yerine kontrol etmelisiniz .
Mārtiņš Briedis

3
@ MārtiņšBriedis, eğer olmasaydı bir dizi indisinin sınırların dışına çıkmasına neden olur. Daha iyi bir kontrol olurduarray_key_exists('check_list', $_POST) && !empty($_POST['check_list'])
Tyzoid

2
@ Tyzoid empty()bu hataya neden olmaz. Kılavuzdan:empty() does not generate a warning if the variable does not exist.
Mārtiņš Briedis

22

Düzenle @Marc'ın aşağıdaki yorumda söylediklerini yansıtmak için.

Gönderilen tüm değerler arasında bir döngü yapabilirsiniz.

HTML:

<input type="checkbox" name="check_list[]" value="<?=$rowid?>" />
<input type="checkbox" name="check_list[]" value="<?=$rowid?>" />
<input type="checkbox" name="check_list[]" value="<?=$rowid?>" />

PHP:

foreach($_POST['check_list'] as $item){
  // query to delete where item = $item
}

1
Tuhaf hata: Uyarı: 30. satırdaki /home1/mountgam/public_html/zombiewrath/reports.php adresindeki foreach () için geçersiz argüman sağlandı = /
James Andrew

2
Bu yalnızca []PHP'nin $ _POST değerini dizi olarak oluşturmasını sağlayan alan tanımında sözdizimini kullanırsanız çalışır . Aksi takdirde, foreach () döngüsünün patlamasına neden olan tek bir dizi olmayan değer olacaktır.
Marc B

1
İkisini de denedim ama tamam tekrar deneyeceğim (Form / isimde [] olmadan)
James Andrew

16

onay kutularınızı buna göre adlandırmanız gerekir:

<input type="checkbox" name="check_list[]" value="…" />

daha sonra işaretli tüm onay kutularına şununla erişebilirsiniz:

// loop over checked checkboxes
foreach($_POST['check_list'] as $checkbox) {
   // do something
}

ps. Çıktınızdan ( htmlspecialchars())


12
<input type="checkbox" name="check_list[<? echo $row['Report ID'] ?>]" value="<? echo $row['Report ID'] ?>">

Ve gönderiden sonra, bunlardan geçebilirsiniz:

   if(!empty($_POST['check_list'])){
     foreach($_POST['check_list'] as $report_id){
        echo "$report_id was checked! ";
     }
   }

Veya önceki sayfadan belirli bir değer yayınlayın:

if(isset($_POST['check_list'][$report_id])){
  echo $report_id . " was checked!<br/>";
}

12

Üzgünüz, eski konu ama bu @JamesRattray ve diğerleri ile ilgili sorunlar için söz etmek önemli bir parçasıdır.

PHP betiğine birden çok değer göndermeye çalışırken inputetiketi (kullanarak />) kendi kendine kapatmayın . Etiketi kendiniz kapattığınızda, dizi tanımını sona erdirir ve gönderiminizde komut dosyanıza yalnızca tek bir değer gönderilir. Aslında @Scone'un cevabı />değiştirilene kadar çalışmayabilir .

Bu Warning: Invalid argument supplied for foreach() in /home1/...durumda PHP hatasına neden olan şey budur .

EDIT: Aşağıdaki yorumlarda belirtildiği gibi, daha ileri araştırmalar bunun DOCTYPE'a bağlı olduğunu göstermektedir. XHTML için DOCTYPE ayarlanmışsa, giriş etiketinin kapatılması gerekir. DOCTYPE HTML5 kümeniz varsa, giriş etiketinin kapatılmaması gerekir. Bunun, kullanıcının sayfayı hangi tarayıcıda görüntülediğine ve kodda belirtilen DOCTYPE'yi ne kadar iyi izlediğine bağlı olma olasılığı da vardır.


Yanlış. Kendiliğinden kapanan giriş etiketi PHP'ye geçen değerleri etkilemez.
Raptor

@ Rapçi Daha ileri araştırmalarda, Evet etkileyebilir VE dediğin gibi, hayır etkilemez. ancak daha fazla araştırmada, sadece DOCTYPE ayarlanmışsa etkilenir. HTML5 etiketi kapalı olarak tanımıyor (ve kapatılmışsa geçersiz olacaktır), XHTML ise etiketin kapatılmasını gerektiriyor. Buradaki W3Schools bilgi sayfasına bakın: bağlantı
Jon Gallup

@ Raptor W3Schools hatalarla dolu olsa da, kendisinin (ve diğer web sitelerinin) sağlayabileceği bilgilerin soruya açık olduğunu belirtmek önemlidir. Ben sadece bir şey sorun giderme sürecinde bir sorunu denemek ve düzeltmek için herhangi bir bilgi NO bilgi daha iyi olduğunu belirtiyorum. Bu durumda, başka bir referans istiyorsanız, W3 , giriş etiketinin uyumsuz olacağı için hiçbir şekilde kapatılmaması gerektiğini belirtir. Orijinal cevabımı DOCTYPE'ı yansıtacak şekilde düzenleyeceğim.
Jon Gallup

5

Oldukça basit. Dikkat edin ve hemen alacaksınız! :)

Daha sonra php dizisine gönderilecek bir html dizisi oluşturacaksınız. Html kodunuz aşağıdaki gibi görünecektir:

<input type="checkbox" name="check_list[1]" alt="Checkbox" value="checked">
<input type="checkbox" name="check_list[2]" alt="Checkbox" value="checked">
<input type="checkbox" name="check_list[3]" alt="Checkbox" value="checked">

Nerede [1] [2] [3]olduğu IDanlamına Mesajlarınızın ler olacak o echosenin $row['Report ID']onların yerine.

Sonra formu gönderdiğinizde, PHP diziniz aşağıdaki gibi görünecektir:

print_r($check_list)

[1] => checked [3] => checked

Hangi kontrol edildi ve hangileri değildi bağlı olarak.

Eminim bu noktadan itibaren devam edebilirsiniz.


6
Bunun yerine check_list[]ile başlayacağını unutmayın . check_list[0]check_list[1]
Hakem

1
value = "işaretli" karşı üretken. Herhangi bir değer belirtilmezse 'on' alırsınız. Değer özniteliklerinde göndermek istediğiniz değerleri belirtmenin avantajı, bir PHP dizi dizini haline gelmesi gerekmeyen neredeyse rastgele verileri gönderebilmenizdir. Foreach ile dizi değerleri üzerinde yineleme yapmak da tuşları yinelemekten daha kolaydır.
Rudiger W.

0

En mi caso necesito que venga en un sólo valor, por lo tanto no me vale una matriz.

    // Primero paso las matrices del post a valores separados por coma.
    foreach($_POST as $n => $v) if (is_array($v)) $_POST[$n] = implode(",", $v);

Con esto me aseguro que los valores sean 1 y ayırmak için koma. Así en MySQL puedo hacer la consulta, venga en matriz o no:

Where id in ($_POST["id"])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.