当 php 变量中有空格时,mysql 数据库不会更新

问题描述 投票:0回答:1

我试图让我的 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}'
php html mysqli
1个回答
0
投票

我会通过仅使用单个循环和查询来简化这一点。

$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();
}

使用准备好的语句应该避免服务名称中特殊字符的任何问题。

© www.soinside.com 2019 - 2024. All rights reserved.