Làm thế nào để đọc nếu một hộp kiểm tra được kiểm tra trong PHP?


266

Làm thế nào để đọc nếu một hộp kiểm tra được kiểm tra trong PHP?


8
Câu hỏi này thực sự có nghĩa là " đã được kiểm tra" (khi mẫu đơn được gửi). PHP xác định nếu một hộp kiểm được kiểm tra sẽ yêu cầu một cuộc gọi Ajax từng nguyên tố này được toggled.
rybo111

Câu trả lời:


342

Nếu trang HTML của bạn trông như thế này:

<input type="checkbox" name="test" value="value1">

Sau khi gửi biểu mẫu, bạn có thể kiểm tra nó với:

isset($_POST['test'])

hoặc là

if ($_POST['test'] == 'value1') ...

57
Hộp kiểm cũng có thể có giá trị on, khi chúng được kiểm tra. Do đó, để tương thích, nó dễ sử dụng hơn isset($_POST['checkboxName']).
Damiqib

13
Giá trị "bật" có thể được một số trình duyệt hỗ trợ khi thuộc tính giá trị không được đặt, nhưng nói chung, tốt hơn là đặt thuộc tính giá trị và kiểm tra xem khi gửi.
m_vitaly

3
Liệu 'Value1' có thay đổi nếu hộp được chọn không?
MoralCode

10
@Developer_ACE Trừ khi tôi hiểu nhầm bạn, giá trị trong ví dụ này sẽ là value1nếu hộp kiểm được chọn. Nếu nó không được kiểm tra, $_POST['test']đơn giản là không tồn tại.
rybo111

104

Zend Framework sử dụng một bản hack đẹp mắt trên các hộp kiểm, bạn cũng có thể tự làm:

Mỗi hộp kiểm được tạo được liên kết với một trường ẩn cùng tên, được đặt ngay trước hộp kiểm và có giá trị là "0". Sau đó, nếu hộp kiểm của bạn là giá trị "1", bạn sẽ luôn nhận được giá trị '0' hoặc '1' trong kết quả GET hoặc POST

<input type="hidden" name="foo" value="0" />
<input type="checkbox" name="foo" value="1"> 

Tôi cũng nhận thấy điều đó, nhưng tôi cảm thấy an toàn khi sử dụng nó: Zend Framework cũng làm điều đó!
hpaknia

Hay đấy. Nhưng có một khả năng nhỏ là tác nhân người dùng có thể gửi giá trị đầu tiên thay vì giá trị cuối cùng, giả sử hộp kiểm được chọn?
rybo111

@ rybo111, đối với tác nhân người dùng tôi không nghĩ vậy, nhưng đối với trình phân tích cú pháp biểu mẫu javascript tùy chỉnh, bạn nên cẩn thận.
regilero

Xin lỗi, ai đó có thể giải thích cho tôi làm thế nào nó hoạt động? Tôi đã không hiểu. Tại sao trường ẩn đó nếu chỉ luôn gửi giá trị cuối cùng (giá trị cuối cùng input[type="checkbox"])?
tonix

6
khi hộp kiểm được bỏ chọn, nó không được truyền trong bài (vì vậy chỉ có ẩn được truyền đi). Khi được kiểm tra, nó được truyền đi và sẽ ghi đè lên giá trị ẩn.
regilero

53

Khi sử dụng các hộp kiểm dưới dạng một mảng:

<input type="checkbox" name="food[]" value="Orange">
<input type="checkbox" name="food[]" value="Apple">

Bạn nên sử dụng in_array():

if(in_array('Orange', $_POST['food'])){
  echo 'Orange was checked!';
}

Hãy nhớ kiểm tra mảng được đặt trước, chẳng hạn như:

if(isset($_POST['food']) && in_array(...

các hộp kiểm dưới dạng một mảng và foreach ($_POST['food'] as $selected_food)để làm việc trên một kiểm tra là tốt, cảm ơn
bcag2

42

Hãy để html cho hộp kiểm của bạn sẽ như thế nào

<input type="checkbox" name="check1">

Sau đó, sau khi gửi biểu mẫu của bạn, bạn cần kiểm tra như

if (isset($_POST['check1'])) {

    // Checkbox is selected
} else {

   // Alternate code
}

Giả sử đó check1phải là tên hộp kiểm của bạn. Và nếu phương thức gửi biểu mẫu của bạn GETthì bạn cần kiểm tra với $_GETcác biến như

if (isset($_GET['check1'])) {

   // Checkbox is selected
} 


6

Tôi đã sử dụng thủ thuật này trong vài năm và nó hoạt động hoàn hảo mà không gặp vấn đề gì đối với trạng thái hộp kiểm tra / không được kiểm tra trong khi sử dụng với PHP và Cơ sở dữ liệu.

Mã HTML: (cho Thêm trang)

<input name="status" type="checkbox" value="1" checked>

Gợi ý: xóa "hộp kiểm" nếu bạn muốn hiển thị nó là không được chọn theo mặc định

Mã HTML: (cho Trang chỉnh sửa)

<input name="status" type="checkbox" value="1" 
<?php if ($row['status'] == 1) { echo "checked='checked'"; } ?>>

Mã PHP: (sử dụng cho các trang Thêm / Chỉnh sửa)

$status = $_POST['status'];
if ($status == 1) {
$status = 1;
} else {
$status = 0;
}

Gợi ý: Sẽ luôn có giá trị trống trừ khi người dùng kiểm tra nó. Vì vậy, chúng ta đã có mã PHP để bắt nó khác giữ giá trị về 0. Sau đó, chỉ cần sử dụng biến $ status cho cơ sở dữ liệu.


1
đây là hình thức thực sự tốt để làm điều này trong php đơn giản thuần túy. nhưng phải lưu ý rằng giá trị của hộp kiểm là chuỗi khi nó được kích hoạt một giá trị không tồn tại nếu nó được chọn.
Elvis Technologies

4

Để kiểm tra nếu một hộp kiểm tra được kiểm tra sử dụng khoảng trống ()

Khi biểu mẫu được gửi, hộp kiểm sẽ LUÔN được đặt, vì TẤT CẢ BÀI ĐĂNG các biến sẽ được gửi cùng với biểu mẫu.

Kiểm tra nếu hộp kiểm được kiểm tra với trống như sau:

//Check if checkbox is checked    
if(!empty($_POST['checkbox'])){
 #Checkbox selected code
} else {
 #Checkbox not selected code
}

3
Nếu hộp kiểm được bỏ chọn, nó sẽ không được đăng, vì vậy nó sẽ LUÔN LUÔN được đặt.
Wessam El Mahdy

^ KHÔNG * luôn được đặt
Bộ luật

3

Bạn có thể kiểm tra giá trị tương ứng là được đặt và không trống trong mảng $ _POST hoặc $ _GET tùy thuộc vào hành động của biểu mẫu của bạn.

tức là: Với dạng POST sử dụng name"test" (nghĩa là : <input type="checkbox" name="test">, bạn sẽ sử dụng:

if(isset($_POST['test']) {
   // The checkbox was enabled...

}

2

Tìm hiểu về isset "hàm" tích hợp nào có thể được sử dụng trong câu lệnh if để biết nếu một biến đã được sử dụng hoặc được đặt

Thí dụ:

    if(isset($_POST["testvariabel"]))
     {
       echo "testvariabel has been set!";
     }

2

Chà, các ví dụ trên chỉ hoạt động khi bạn muốn XÁC NHẬN một giá trị, không hữu ích để CẬP NHẬT các giá trị khác nhau cho các cột khác nhau, vì vậy đây là mẹo nhỏ của tôi để cập nhật:


//EMPTY ALL VALUES TO 0 
$queryMU ='UPDATE '.$db->dbprefix().'settings SET menu_news = 0, menu_gallery = 0, menu_events = 0, menu_contact = 0';
            $stmtMU = $db->prepare($queryMU);
            $stmtMU->execute();
if(!empty($_POST['check_menus'])) {
    foreach($_POST['check_menus'] as $checkU) {
try {
//UPDATE only the values checked
    $queryMU ='UPDATE '.$db->dbprefix().'settings SET '.$checkU.'= 1';
            $stmtMU = $db->prepare($queryMU);
            $stmtMU->execute();  
        } catch(PDOException $e) {
          $msg = 'Error: ' . $e->getMessage();}

        }
}
<input type="checkbox" value="menu_news" name="check_menus[]" />
<input type="checkbox" value="menu_gallery" name="check_menus[]" />

....

Bí mật chỉ là cập nhật tất cả GIÁ TRỊ trước tiên (trong trường hợp này là 0) và vì sẽ chỉ gửi các giá trị đã kiểm tra, điều đó có nghĩa là mọi thứ bạn nhận được nên được đặt thành 1, vì vậy mọi thứ bạn nhận được đều được đặt thành 1.

Ví dụ là PHP nhưng áp dụng cho mọi thứ.

Chúc vui vẻ :)


2

Bạn có thể làm điều đó với ngắn nếu:

$check_value = isset($_POST['my_checkbox_name']) ? 1 : 0;

hoặc với PHP7 mới Null coalescing operator

$check_value = $_POST['my_checkbox_name'] ?? 0;

1
$is_checked = isset($_POST['your_checkbox_name']) &&
              $_POST['your_checkbox_name'] == 'on';

Đánh giá ngắn mạch sẽ cẩn thận để bạn không truy cập your_checkbox_namekhi nó không được gửi.


1

Một kiểm tra boolean tối giản với giữ vị trí chuyển đổi

<?php

$checked = ($_POST['foo'] == ' checked');

?>

<input type="checkbox" name="foo" value=" checked"<?=$_POST['foo']?>>

1
Khi đưa ra câu trả lời, tốt nhất là đưa ra một số lời giải thích về lý do TẠI SAO câu trả lời của bạncâu trả lời . Điều này đặc biệt đúng khi trả lời một bài viết RẤT cũ 11 câu trả lời khác.
Stephen Rauch

Thật tốt khi bạn nhận ra sự cần thiết của hộp kiểm tra để giữ trạng thái của nó. Tuy nhiên, mã của bạn để làm điều này là không chính xác.
Vern Jensen

1
<?php

  if (isset($_POST['add'])) {

    $nama      = $_POST['name'];
    $subscribe = isset($_POST['subscribe']) ? $_POST['subscribe'] : "Not Checked";

    echo "Name: {$nama} <br />";
    echo "Subscribe: {$subscribe}";

    echo "<hr />";   

  }

?>

<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="POST" >

  <input type="text" name="name" /> <br />
  <input type="checkbox" name="subscribe" value="news" /> News <br />

  <input type="submit" name="add" value="Save" />

</form>

bạn có thể giải thích mục tiêu của bạn ở đây?
Elvis Technologies

0

trong BS3 bạn có thể đặt

  <?php
                  $checked="hola";
                  $exenta = $datosOrdenCompra[0]['exenta'];
                  var_dump($datosOrdenCompra[0]['exenta']);
                  if(isset($datosOrdenCompra[0]['exenta']) and $datosOrdenCompra[0]['exenta'] == 1){

                      $checked="on";

                  }else{
                    $checked="off";
                  }

              ?>
              <input type="checkbox" id="exenta" name="exenta" <?php echo $checked;?> > <span class="label-text"> Exenta</span>

Xin lưu ý việc sử dụngisset($datosOrdenCompra[0]['exenta'])


0

filter_input (INPUT_POST, 'box_name', FILTER_DEFAULT, FILTER_FORCE_ARRAY)


0

Wordpress có checked()chức năng. Tham khảo: https://developer.wordpress.org/reference/fifts/checked/

checked( mixed $checked, mixed $current = true, bool $echo = true )

Mô tả So sánh hai đối số đầu tiên và nếu các dấu giống hệt nhau được chọn

Tham số $ đã kiểm tra (hỗn hợp) (Bắt buộc) Một trong các giá trị để so sánh

$ current (hỗn hợp) (Tùy chọn) (true) Giá trị khác để so sánh nếu không chỉ đúng Giá trị mặc định: true

$ echo (bool) (Tùy chọn) Có lặp lại hay chỉ trả về chuỗi Giá trị mặc định: true

Trả về thuộc tính html #Return (chuỗi) hoặc chuỗi rỗng


-3
<?php

if(isset($_POST['nameCheckbox'])){
    $_SESSION['fr_nameCheckbox'] = true;
}

?>

<input type="checkbox" name="nameCheckbox" 

<?php 

if(isset($_SESSION['fr_nameCheckbox'])){
    echo 'checked'; 
    unset($_SESSION['fr_nameCheckbox']);
} 

?>

Chào mừng bạn đến với Stack Overflow! Mặc dù đoạn mã này có thể giải quyết vấn đề, nhưng nó không giải thích tại sao hoặc làm thế nào để trả lời câu hỏi. Vui lòng bao gồm một lời giải thích cho mã của bạn , vì điều đó thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. Flaggers / người đánh giá: Đối với các câu trả lời chỉ có mã như câu trả lời này, downvote, không xóa!
Scott Weldon
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.