使用复选框更新数据库列

Posted

技术标签:

【中文标题】使用复选框更新数据库列【英文标题】:Updating database column with checkbox 【发布时间】:2016-11-30 16:46:48 【问题描述】:
echo "<form action=\"".$_SERVER['php_SELF']."\" method=\"POST\">";
    if ($isAdmin === '1')
        echo "<input id=\"checkbox\" name=\"checkbox\" type=\"checkbox\" checked=\"checked\" value=\"1\" />";
     else 
        echo "<input id=\"checkbox\" name=\"checkbox\" type=\"checkbox\" value=\"0\" />";
    
    echo "<input type=\"submit\" name=\"formSubmit\" value=\"X\" />";
echo "</form>";

上面的代码在一个while循环中,所以它为每个用户创建了一个表单。我的 php 代码如下所示:

$status = '0';
if (isset($_POST['checkbox']) && $_POST['checkbox'] == '1') 
    $status = $_POST['checkbox'];


$stmt = $mysqli->prepare("UPDATE members SET isAdmin = ? WHERE id = \"$id\"");
$stmt->bind_param('s', $status);

$stmt->execute();

$stmt->close();
$mysqli->close();

没有真正将表单提交到服务器,为什么管理员用户只是刷新页面就变成了非管理员用户?


更新代码:

?>

<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="POST">
    <input type="checkbox" id="checkbox" name="checkbox" value="<?php echo ($checked)? '1' : '0'; ?>"<?php if($checked) echo ' checked="checked"'; ?> />
    <input type="hidden" id="userid" name="userid" value="<? echo $members_row['id']; ?>" />
    <input type="submit" id="submit" name="submit" value=">>" />
</form>

<?

$status = '0';
if (isset($_POST['checkbox']) && $_POST['checkbox'] == '1') 
    $status = $_POST['checkbox'];
    $id = $_POST['id'];

    $stmt = $mysqli->prepare("UPDATE members SET isAdmin = ? WHERE id = \"$id\"");
    $stmt->bind_param('s', $status);

    $stmt->execute();

    $stmt->close();
    $mysqli->close();

【问题讨论】:

请多写一点代码。 $isAdmin 是如何设置的? 对不起,它是从数据库最初设置的 0 或非管理员用户中提取的。有问题的表单是管理员用户如何授予非管理员用户访问权限。 在我看来,您应该将右括号放在 php sn-p 的末尾,以便所有代码在 $_POST['checkbox'] 上执行。每次在$status = '0' 重新加载时都会执行,不是吗? @Rasclatt 以便解决一个问题,我刚刚测试过,它实际上并没有更新数据库。 为什么要使用prepared statements,只绑定一个参数,然后直接嵌入一个明显的参数-id 【参考方案1】:

做几件事,把你的括号移到 php sn-p 的末尾,然后检查 post 是否已设置但不等于任何内容。 $status 将用于在发布时对其进行更新。旁注,由于表单处于循环中,id="checkbox" 在/如果您使用 javascript 时将成为问题。 id="*" 应该是唯一的以提供价值。最后,$id 的来源在提供的脚本中是未知的,您需要确保 bind_param 也具有该值(也许它应该由帖子提供?)。不确定该变量的来源,因此很难对此发表评论。

$checked = ($isAdmin == '1');
?>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="POST">
    <input id="checkbox" name="checkbox" type="checkbox" value="<?php echo ($checked)? '1' : '0'; ?>"<?php if($checked) echo ' checked="checked"'; ?> />
    <input type="submit" name="formSubmit" value="X" />
</form>
<?php //continue with loop

大概这是因为您的表单引用了PHP_SELF

<?php
if (isset($_POST['checkbox'])) 
    $status = $_POST['checkbox'];
    // The $id variable is suspect here. Probably should be provided by the post?
    $stmt = $mysqli->prepare("UPDATE members SET isAdmin = ? WHERE id = '$id'");
    $stmt->bind_param('s', $status);
    $stmt->execute();
    $stmt->close();
    $mysqli->close();

如果我这样做,我会使用函数或类/方法来使其更易于阅读和重用:

function updateUserRole($id,$status,$mysqli)
    
        $stmt = $mysqli->prepare("UPDATE members SET isAdmin = ? WHERE id = ?");
        $stmt->bind_param('si', $status,$id);
        $stmt->execute();
        $stmt->close();
    

// To execute, include the function
// then run the "if" condition
if (isset($_POST['checkbox']))
    updateUserRole($_POST['id'],$_POST['checkbox'],$mysqli);

【讨论】:

那个 php 代码不能解决问题,只是重新创建了原始问题 你从哪里得到$id?您已对 $id 进行硬编码,因此它将始终使用表单中的管理员帖子值更新该 id 值。 您可能需要在表单中提供id 值,以便在提交时使用管理员值发布 id。不?比如:&lt;input type="hidden" name="id" value="&lt;?php echo $row['id']; ?&gt;" /&gt; 然后在处理中,你做$id = $_POST['id']; 然后你在运行sql时也绑定它。 $id 实际上来自另一个查询语句的数据库

以上是关于使用复选框更新数据库列的主要内容,如果未能解决你的问题,请参考以下文章

包含要添加动态列的复选框的 GWT EXT 网格?

列过滤器复选框未更新

从 HTML 中的复选框值更新 MySql 数据库的建议

更新数据库条目

element-ui多选框reserve-selection指定row-key保留数据更新之前的数据

使用jquery检查复选框时如何更新数据库?