Nhận $ _POST từ nhiều hộp kiểm


158

Tôi có 1 biểu mẫu với nhiều hộp kiểm trong đó (mỗi hộp có mã):

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

Trường hợp $row['Report ID']khóa chính trong cơ sở dữ liệu - mỗi giá trị là khác nhau.

Làm thế nào tôi có thể biết hộp kiểm nào đã được kiểm tra? (Có thể nhiều)

Đây là một hệ thống hộp thư đến và tôi có một nút bên dưới mà tôi muốn (khi nhấp vào) để xóa tất cả các tin nhắn (id của $row['Report ID']:) có hộp kiểm được chọn.

Câu trả lời:


333

Đặt tên trong biểu mẫu thành check_list[]và bạn sẽ có thể truy cập tất cả các hộp kiểm dưới dạng một mảng ( $_POST['check_list'][]).

Đây là một mẫu nhỏ theo yêu cầu:

<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
Bạn có thể cho tôi một ví dụ về hộp kiểm echo (ing) một check_list [] không? (Và nó sẽ giống nhau cho hai người được chọn?) Cảm ơn.
James Andrew

2
Tôi cũng nên xác định rằng nếu không có giá trị nào được đặt trong HTML, $checksẽ bằng nhau on.
Sean Walsh

9
if($_POST)- vô dụng, $_POSTsẽ luôn luôn đúng Bạn nên kiểm tra nếu !empty($_POST['check_list'])thay vào đó.
Mārtiņš Briedis

3
@ MārtiņšBriedis sẽ khiến chỉ số mảng vượt quá giới hạn nếu nó không tồn tại. Kiểm tra tốt hơn sẽ làarray_key_exists('check_list', $_POST) && !empty($_POST['check_list'])
Tyzoid

2
@Tyzoid empty()không gây ra lỗi này. Từ hướng dẫn:empty() does not generate a warning if the variable does not exist.
Mārtiņš Briedis

22

Chỉnh sửa Để phản ánh những gì @Marc đã nói trong bình luận bên dưới.

Bạn có thể thực hiện một vòng lặp thông qua tất cả các giá trị được đăng.

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
Lỗi lạ: Cảnh báo: Đối số không hợp lệ được cung cấp cho foreach () trong /home1/mountgam/public_html/zombiewrath/reports.php trên dòng 30 = /
James Andrew

2
Điều đó sẽ chỉ hoạt động nếu bạn sử dụng []cú pháp trong định nghĩa trường, điều này làm cho PHP tạo ra giá trị $ _POST đó dưới dạng một mảng. Nếu không, nó sẽ là một giá trị không phải là mảng duy nhất, làm cho vòng lặp foreach () nổ tung.
Marc B

1
Tôi đã thử cả hai, nhưng ok tôi sẽ thử lại (Không có [] ở dạng / tên)
James Andrew

16

bạn phải đặt tên cho các hộp kiểm của bạn cho phù hợp:

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

sau đó bạn có thể truy cập tất cả các hộp kiểm tra với

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

ps. đảm bảo thoát đúng đầu ra của bạn ( htmlspecialchars())


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

Và sau khi đăng bài, bạn có thể lặp qua chúng:

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

Hoặc nhận được một giá trị nhất định được đăng từ trang trước:

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

12

Xin lỗi, chủ đề cũ nhưng đây là một phần quan trọng cần đề cập cho vấn đề này, mà @JamesRattray và những người khác đang gặp vấn đề.

KHÔNG tự đóng inputthẻ (sử dụng />) khi bạn đang cố đăng nhiều giá trị lên tập lệnh PHP. Khi bạn tự đóng thẻ, nó sẽ kết thúc định nghĩa mảng và bạn sẽ chỉ có một giá trị duy nhất được đăng lên tập lệnh của mình khi gửi. Trong thực tế, câu trả lời của @Scone có thể không hoạt động cho đến khi />thay đổi.

Đây là nguyên nhân gây ra Warning: Invalid argument supplied for foreach() in /home1/...lỗi PHP trong trường hợp này.

EDIT: Như đã lưu ý trong các ý kiến ​​dưới đây, nghiên cứu thêm cho thấy điều này phụ thuộc vào DOCTYPE. Nếu bạn đã đặt DOCTYPE cho XHTML, nó sẽ yêu cầu đóng thẻ đầu vào. Nếu bạn có bộ HTML5 của DOCTYPE, nó sẽ yêu cầu không đóng thẻ đầu vào. Cũng có khả năng điều này có thể được quyết định bởi trình duyệt nào người dùng đang xem trang và mức độ tuân theo DOCTYPE được chỉ định trong mã.


Sai. Thẻ đầu vào tự đóng sẽ không ảnh hưởng đến các giá trị chuyển sang PHP.
Raptor

@Raptor Khi nghiên cứu thêm, Có, nó có thể ảnh hưởng VÀ như bạn nói, không, không. nhưng về nghiên cứu sâu hơn, nó chỉ bị ảnh hưởng nếu DOCTYPE được đặt. HTML5 không nhận ra thẻ là đã bị đóng (và sẽ không hợp lệ nếu bị đóng), trong khi XHTML yêu cầu phải đóng thẻ. Xem trang thông tin của W3Schools trên đây: link
Jon Gallup

@Raptor Mặc dù W3Schools có thể có nhiều lỗi, nhưng điều quan trọng cần lưu ý là thông tin mà nó (và các trang web khác) có thể cung cấp có liên quan đến câu hỏi. Tôi chỉ đơn thuần nói rằng trong quá trình xử lý sự cố BẤT K information thông tin nào đó để thử và khắc phục sự cố tốt hơn thông tin KHÔNG. Trong trường hợp này, nếu bạn muốn một tham chiếu khác, W3 chỉ định rằng thẻ đầu vào không được đóng theo bất kỳ cách nào vì nó sẽ không tuân thủ. Tôi sẽ chỉnh sửa câu trả lời ban đầu của mình để phản ánh DOCTYPE.
Jon Gallup

5

Nó khá đơn giản. Hãy chú ý và bạn sẽ nhận được nó ngay lập tức! :)

Bạn sẽ tạo một mảng html, sau đó sẽ được gửi đến mảng php. Mã html của bạn sẽ trông như thế này:

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

Trong trường hợp [1] [2] [3]IDs các thông điệp của bạn, có nghĩa là bạn sẽ echocủa bạn $row['Report ID']ở vị trí của họ.

Sau đó, khi bạn gửi biểu mẫu, mảng PHP của bạn sẽ trông như thế này:

print_r($check_list)

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

Tùy thuộc vào cái nào được kiểm tra và cái nào không.

Tôi chắc rằng bạn có thể tiếp tục từ thời điểm này trở đi.


6
Hãy nhớ rằng check_list[]sẽ bắt đầu với check_list[0]chứ không phải check_list[1].
Trọng tài

1
value = "đã kiểm tra" là phản tác dụng. Nếu không có giá trị nào được chỉ định, bạn sẽ nhận được 'bật'. Ưu điểm của việc chỉ định các giá trị bạn muốn gửi trong các thuộc tính giá trị là bạn có thể gửi dữ liệu gần như tùy ý mà không phải trở thành một chỉ mục mảng PHP. Lặp lại các giá trị mảng bằng foreach cũng dễ hơn lặp lại các khóa.
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 separados por coma. Así en MySQL puedo hacer la Consulta, venga en matriz o no:

Where id in ($_POST["id"])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.