簡體   English   中英

PHP-獲取復選框值,如果在數據庫中簽入,則將其更改

[英]PHP - get checkbox value and change it if checked in database

id  name            level   delete_user

1   visitor         1       N
2   user            2       N
3   moderator       3       N
4   administrator   4       Y

然后我從數據庫中獲取數組:

$groups = array (
    array ( 'id' => 1, 'name' => 'visitor', 'level' => 1, 'delete_user' => 'N'),
    array ( 'id' => 2, 'name' => 'user', 'level' => 2, 'delete_user' => 'N'),
    array ( 'id' => 3, 'name' => 'moderator', 'level' => 3, 'delete_user' => 'N'),
    array ( 'id' => 4, 'name' => 'administrator', 'level' => 4, 'delete_user' => 'Y')
);

然后,我創建一個簡單的FORM來顯示組的實際設置。

<form action="" method="post">
    <table class="groups">
        <thead>
            <tr>
                <td>name</td>
                <td>level</td>
                <td>delete user</td>
            </tr>
        </thead>
        <tbody>
            <?php foreach ($groups as $group) { ?>
                <?php 
                    $checkbox['delete_user_' . $group['id']] = 'N';
                    $checked = ($group['delete_user'] === 'Y') ? 'checked="checked"' : '';
                ?>    
                <tr>
                    <td><?php echo $group['name']; ?></td>
                    <td><?php echo $group['level']; ?></td>
                    <td>
                        <input type="checkbox" name="delete_user_<?php echo $group['id']; ?>" <?php echo $checked; ?> value="Y">
                    </td>
                </tr>
                <?php
            }
            ?>
        </tbody>    
    </table>
    <input type="submit" name="save_groups" value="Save" class="save_button">
</form>

問題:如何檢查復選框是否已選中,如果已選中然后在數據庫中進行更改?

我的工作:

這是個主意,但並不漂亮...

<?php
if (isset($_POST['save_groups'])) {

    foreach ($_POST as $k => $v) {
        if (array_key_exists($k, $checkbox)) {
            $checkbox[$k] = $v;
        }
    }
    echo 'NEW';
    print_r($checkbox);
    echo '<hr>';
    foreach($checkbox as $k => $v) {
        $id = str_replace('delete_user_', '', $k);
        echo 'changing '. $id . ' to '. $v. '<br>';
        // changing value
        /**
         * $id int - id of group
         * $v string - value in delete_user ('Y' / 'N')
         */
        $this->change_value($id, $v);
    }

}

雖然在提交表單期間未選中的復選框不會被序列化,但是您可以簡單地利用這個非常常見的技巧:

要確定是否選中了復選框,可以在復選框本身之前添加<input type="hidden" /> ,例如:

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

因此,如果選中了復選框,則$_POST['foo']將包含1 ,如果未選中,則$_POST['foo']將包含0

一種方法是將復選框變成數組並更改它,以便它返回組ID,而不僅僅是“ Y”。 更新 :根據下面的安東尼的評論,您也需要跟蹤現有的檢查狀態:

<td>
    <?php if ($group['delete_user'] === 'Y') { ?>
    <input type="hidden" name="existing[]" value="<?php echo <?php echo $group['id']; ?>">
    <?php } ?>
    <input type="checkbox" name="delete_user[]" <?php echo $checked; ?> value="<?php echo <?php echo $group['id']; ?>">
</td>

現在,您在POST代碼中要做的就是:

<?php
$previously_checked = $_POST['existing'];
$group_ids = $_POST['delete_user'];
$updated_state = array();

// Check if previously-selected checkbox has been unchecked
foreach($previously_checked as $group_id) {
   if (!in_array($group_id, $group_ids)) {
      $updated_state[] = array('group_id' => $group_id, 'delete_user' => 'N');
   }
}
// Check for currently-selected checkbox was previously unchecked
foreach($group_ids as $group_id) {
   if (!in_array($group_id, $previously_checked)) {
      $updated_state[] = array('group_id' => $group_id, 'delete_user' => 'Y');
   }
}

// Do the update...

不要做@ Scorpion,@ Ken或我之前寫的內容。 只需根據id(主鍵)為所有復選框輸入控件賦予其自己的名稱(就像您剛開始一樣),然后在輸入驗證期間,使用isset($_POST['yourKeyHere'])即可確定記錄的復選框是否為是否成功提交。 如果是這樣,請在關聯的記錄上運行“正” UPDATE。 如果不是,對記錄運行“負”更新。 簡單而甜美,即使沒有一點浪費。 此方法不會損害表單應用程序的安全性,但可能會在表上運行不必要的更新(因為該字段已經為“ N”或“ Y”)。

您不想邀請人們向您的應用程序提交垃圾。 哦,有一種方法可以簡單地通過更改HTML來實現,但是當未選中此復選框時,我不希望我的后端為該輸入控件接收任何東西!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM