Dapatkan $ _POST dari beberapa kotak centang

159

Saya memiliki 1 formulir dengan beberapa kotak centang di dalamnya (masing-masing berisi kode):

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

Di mana $row['Report ID']kunci utama dalam database-sehingga setiap nilai berbeda.

Bagaimana saya bisa mengetahui kotak centang mana yang sudah diperiksa? (Mungkin banyak)

Ini untuk sistem kotak masuk dan saya memiliki tombol di bawah ini yang saya inginkan (ketika diklik) untuk menghapus semua pesan (id dari:) $row['Report ID']yang dicentang kotak centangnya.

James Andrew
sumber

Jawaban:

334

Tetapkan nama dalam formulir check_list[]dan Anda akan dapat mengakses semua kotak centang sebagai array ( $_POST['check_list'][]).

Berikut sedikit contoh seperti yang diminta:

<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.
    }
}
?>
Sean Walsh
sumber
4
Bisakah Anda memberi saya contoh kotak centang echo (ing) satu check_list []? (Dan apakah akan serupa untuk dua yang dipilih?) Terima kasih.
James Andrew
2
Saya juga harus menentukan bahwa jika tidak ada nilai yang diatur dalam HTML, $checkakan sama on.
Sean Walsh
9
if($_POST)- Tidak berguna, $_POSTakan selalu benar. Anda harus memeriksa jika !empty($_POST['check_list'])bukan.
Mārtiņš Briedis
3
@ MārtiņšBriedadalah yang akan menyebabkan indeks array di luar batas jika tidak ada. Pemeriksaan yang lebih baik adalaharray_key_exists('check_list', $_POST) && !empty($_POST['check_list'])
Tyzoid
2
@ Tyzoid empty()tidak menyebabkan kesalahan ini. Dari manual:empty() does not generate a warning if the variable does not exist.
Mārtiņš Briedis
22

Sunting Untuk mencerminkan apa yang @Marc katakan dalam komentar di bawah.

Anda dapat melakukan perulangan melalui semua nilai yang diposting.

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
}
Scone
sumber
1
Kesalahan aneh: Peringatan: Argumen tidak valid diberikan untuk foreach () di /home1/mountgam/public_html/zombiewrath/reports.php pada saluran 30 = /
James Andrew
2
Itu hanya akan berfungsi jika Anda menggunakan []sintaks dalam definisi bidang, yang membuat PHP membuat nilai $ _POST sebagai array. Kalau tidak, itu akan menjadi nilai non-array tunggal, menyebabkan foreach () loop meledak.
Marc B
1
Saya mencoba keduanya, tapi ok saya akan coba lagi (Tanpa [] dalam bentuk / nama)
James Andrew
16

Anda harus memberi nama kotak centang Anda sesuai:

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

Anda kemudian dapat mengakses semua kotak centang yang dicentang dengan

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

ps. pastikan untuk keluar dari output Anda dengan benar ( htmlspecialchars())

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

Dan setelah posting, Anda dapat mengulanginya:

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

Atau dapatkan nilai tertentu yang diposkan dari halaman sebelumnya:

if(isset($_POST['check_list'][$report_id])){
  echo $report_id . " was checked!<br/>";
}
Mārtiņš Briedis
sumber
12

Maaf, topik lama tapi ini adalah salah satu bagian penting untuk disebutkan untuk ini, yang @JamesRattray dan yang lainnya mengalami masalah dengan.

JANGAN menutup inputtag sendiri (menggunakan />) ketika Anda mencoba memposting beberapa nilai ke skrip PHP. Ketika Anda menutup sendiri tag, itu mengakhiri definisi array dan Anda hanya akan memiliki satu nilai yang diposting ke skrip Anda saat pengiriman. Akibatnya, jawaban @Scone mungkin tidak berfungsi hingga />diubah.

Inilah yang menyebabkan Warning: Invalid argument supplied for foreach() in /home1/...kesalahan PHP dalam hal ini.

EDIT: Seperti disebutkan dalam komentar di bawah, penelitian lebih lanjut menunjukkan bahwa ini tergantung pada DOCTYPE. Jika Anda mengatur DOCTYPE untuk XHTML, tag input harus ditutup. Jika Anda memiliki kumpulan HTML5 DOCTYPE, tag input tidak perlu ditutup. Ada juga kemungkinan bahwa ini dapat ditentukan oleh browser apa pengguna melihat halaman dan seberapa baik mengikuti DOCTYPE yang ditentukan dalam kode.

Jon Gallup
sumber
Salah. Tag input yang ditutup sendiri tidak akan memengaruhi nilai yang masuk ke PHP.
Raptor
@Raptor Pada penelitian lebih lanjut, Ya itu dapat mempengaruhi DAN seperti yang Anda katakan, tidak itu tidak. tetapi pada penelitian lebih lanjut, itu hanya terpengaruh jika DOCTYPE diatur. HTML5 tidak mengenali tag sebagai ditutup (dan akan menjadi tidak valid jika ditutup), sedangkan XHTML memang mengharuskan tag untuk ditutup. Lihat halaman info W3Schools di sini di sini: tautan
Jon Gallup
@Raptor Walaupun W3Schools mungkin penuh kesalahan, penting untuk dicatat bahwa informasi yang diberikannya (dan situs web lain) dapat meyakinkan pertanyaan tersebut. Saya hanya menyatakan bahwa dalam proses pemecahan masalah sesuatu APAPUN informasi untuk mencoba dan memperbaiki masalah lebih baik daripada TIDAK ada informasi. Dalam hal ini, jika Anda ingin referensi lain, W3 menetapkan bahwa tag input tidak boleh ditutup dengan cara apa pun karena itu akan tidak sesuai. Saya akan mengedit jawaban asli saya untuk mencerminkan DOCTYPE.
Jon Gallup
5

Sederhana saja. Perhatikan dan Anda akan segera mendapatkannya! :)

Anda akan membuat array html, yang kemudian akan dikirim ke array php. Kode html Anda akan terlihat seperti ini:

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

Di mana [1] [2] [3]adalah IDs pesan Anda, yang berarti bahwa Anda akan echoAnda $row['Report ID']di tempat mereka.

Kemudian, ketika Anda mengirimkan formulir, array PHP Anda akan terlihat seperti ini:

print_r($check_list)

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

Tergantung mana yang diperiksa dan mana yang tidak.

Saya yakin Anda dapat melanjutkan dari titik ini ke depan.

Richard Rodriguez
sumber
6
Ingat itu check_list[]akan dimulai dengan check_list[0]alih - alih check_list[1].
Arbiter
1
value = "checked" adalah kontra-produktif. Jika tidak ada nilai yang ditentukan Anda mendapatkan 'on'. Keuntungan menentukan nilai yang ingin Anda kirimkan dalam atribut nilai adalah bahwa Anda dapat mengirim data yang hampir sewenang-wenang yang tidak harus menjadi indeks array PHP. Iterasi lebih dari nilai array dengan foreach juga lebih mudah daripada iterasi di atas tombol.
Rudiger W.
0

Jika Anda ingin melakukannya, silakan, jangan lakukan ini lagi.

    // 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 separados por coma. Setelah MySQL menjadi lebih populer, silakan klik di sini:

Where id in ($_POST["id"])
Manu Burrero Sánchez
sumber