我试图让我的 mysql 数据库在选中/取消选中复选框时更新列中的值。这适用于 1 个单词变量,但当选中的复选框有 2 个单词(换句话说,字符串中有空格)时,会以某种方式拒绝。
表单中的复选框列表取自数据库,该数据库保存用于复选框名称字段的名称和显示的实际文本。
<input type="checkbox" class="form-check-input filter_check" value="<?= $row['buttons_allowed_activated']; ?>" name="<?= $row['Service']; ?>" id="labels" <?php if ($activate_status == 1) echo 'checked="checked"'; ?>><?= $row['Service'];?>
这工作完美,当涉及到从数据库服务列获取的“我的价值”等值时,没有任何问题。
从那里开始,当表单发布时(像往常一样),编辑文档将接管,并且我会检查每个服务(通过服务名称,因为它来自复选框字段中的数据库)是否选中了复选框:
$checkboxes_array = array();
$unset_value = array();
if (isset($_POST['Service1'])) {
$checkboxes_array[] = 'Service1';
} else {
$unset_values[] = 'Service1';
}
if (isset($_POST['My Service2'])) {
$checkboxes_array[] = 'My Service2';
} else {
$unset_values[] = 'My Service2';
}
if (isset($_POST['Service3'])) {
$checkboxes_array[] = 'Service3';
} else {
$unset_values[] = 'Service3';
}
然后我循环它们,因为此表单的想法是在主页上启用/禁用服务。这是通过循环遍历
$unset_values
数组作为 $checkboxes_array
来了解哪些应该在数据库中设置启用标签 (1) 或哪些应该设置为禁用 (0)。
foreach ($checkboxes_array as &$checkbox){
$button_set_results = mysqli_query($conn, "SELECT * FROM buttons_allowed INNER JOIN buttons ON buttons_allowed.buttons_allowed_button_id=buttons.button_id WHERE (buttons_allowed_userid) IN ('".$userId."') AND (Service) IN ('".$checkbox."') ");
while ($rows = mysqli_fetch_array($button_set_results)){
$button_set_service = $rows['Service'];
$update = mysqli_query($conn, "UPDATE buttons_allowed INNER JOIN buttons ON buttons_allowed.buttons_allowed_button_id=buttons.button_id set buttons_allowed_activated = 1 where Service = '".$button_set_service."' and buttons_allowed_userid = '".$userId."' ");
}
}
foreach( $unset_values as &$unset_value ){
$button_unset_results = mysqli_query($conn, "SELECT * FROM buttons_allowed INNER JOIN buttons ON buttons_allowed.buttons_allowed_button_id=buttons.button_id WHERE (buttons_allowed_userid) IN ('".$userId."') AND (Service) IN ('".$unset_value."') ");
while ($rows = mysqli_fetch_array($button_unset_results)){
$button_unset_service = $rows['Service'];
$update = mysqli_query($conn, "UPDATE buttons_allowed INNER JOIN buttons ON buttons_allowed.buttons_allowed_button_id=buttons.button_id set buttons_allowed_activated = 0 where Service = '".$button_unset_service."' and buttons_allowed_userid = '".$userId."' ");
}
}
从我所看到的来看,我无法将带有空格的字符串的禁用标签(buttons_allowed_activated)设置为 0,同时又无法将它们设置为启用,这是没有意义的。除了使用的数组和为 Buttons_allowed_activated 列设置的值之外,代码完全相同。
我在这里错过了什么或者我做错了什么?
我检查了数组中的值是否正确并且与服务列一致。
我在数据库本身中尝试了调用,它正常工作,并且实际上将值设置为 1,因为它应该:
UPDATE buttons_allowed INNER JOIN buttons ON buttons_allowed.buttons_allowed_button_id=buttons.button_id set buttons_allowed_activated = 1 where Service = 'My Service2' and buttons_allowed_userid = '{user id for testing purposes}'
我会通过仅使用单个循环和查询来简化这一点。
$services = ['Service1', 'My Service2', 'Service3'];
$userid = '{user id for testing purposes}';
$stmt = $conn->prepare("
UPDATE buttons_allowed
INNER JOIN buttons ON buttons_allowed.buttons_allowed_button_id=buttons.button_id
SET buttons_allowed_activated = ? where Service = ? and buttons_allowed_userid = ?");
$stmt->bind_param("iss", $enabled, $service, $userid);
foreach ($services as $service) {
$enabled = isset($_POST[$service]);
$stmt->execute();
}
使用准备好的语句应该避免服务名称中特殊字符的任何问题。