[英]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.