【问题标题】:Set Checkbox to CHECKED on Page Refresh based off of PHP Conditional根据 PHP Conditional 在页面刷新时将复选框设置为 CHECKED
【发布时间】:2017-01-26 16:42:01
【问题描述】:

希望这不是重复的,所以请多多包涵。

我有一个表单,它是一系列复选框,它在数据库中设置一个从 0 到 1 的布尔值,然后在提交时,它获取这些值,更新数据库,然后刷新页面,这样如果值是设置为 0 复选框未选中,如果值为 1,则选中复选框。所有这些都有效 - 我的这部分代码没有问题。

我的问题是,在我的 SUBMIT 按钮上方,我有一个 Select/Deselect All 按钮,如果选择了 ALL,则在页面刷新时,复选框保持选中状态。但是在刷新时,该按钮未被选中,我必须单击它两次才能使复选框取消选中所有前面提到的复选框。

这是我的代码:

<form action="" method="post">
<?php
    while( $row = mysql_fetch_array($result) ){
        $id = $row['id'];
        $active = $row['active'];
        $name = $row['name'];
        $class = $row['class'];

        if($active == '1'){
            **IF ANY OF THESE CHECKBOXES ARE ACTIVE, THEN THE SELECT/DESELECT ALL BUTTON SHOULD BE CHECKED -- WHAT IS THE PROPER SYNTAX???**
        }


        echo "<input type='hidden' name='activate_".$id."' value='0'>";
        echo "<label class='switch'><input type='checkbox' class='checkbox' name='activate_".$id."' value='1'";

        if($active == '1'){
            echo "checked='checked'";

        }

        echo "/><div class='slider'></div><span>" . $name . "</span></label>";

    }

mysql_close();
?>
<label for="select_all" class="selectAllLabel"><input type="checkbox" id="select_all"/> Activate/Deactivate All</label>
<input type="submit" class="submit" name="submit" value="Update Active Roster">
</form>
 <iframe src="index.html" width="376" height="260" style="border: 0;"></iframe>

<?php

    if(isset($_POST['submit'])){

        require "config.php";

        $conn = new mysqli($db_host, $db_user, $db_pass, $db_name);
        if ($conn->connect_error) {
            die("Connection failed: " . $conn->connect_error);
        } 

        for ($i = 1; $i<count($_POST); $i++){
            $sql = "UPDATE roster SET active = ".$_POST["activate_$i"]." WHERE id = ".$i;
            if ($conn->query($sql) === TRUE) {
                echo "";
            } else {
                echo $conn->error;
            }
        }

        $conn->close();
        echo "<meta http-equiv='refresh' content='0'>";

    }

?>
<script>
$(document).ready(function(){
    //select all checkboxes
    $("#select_all").change(function(){  //"select all" change 
        var status = this.checked; // "select all" checked status
        $('.checkbox').each(function(){ //iterate all listed checkbox items
            this.checked = status; //change ".checkbox" checked status
        });
    });

    $('.checkbox').change(function(){ //".checkbox" change 
        //uncheck "select all", if one of the listed checkbox item is unchecked
        if(this.checked == false){ //if this item is unchecked
            $("#select_all")[0].checked = false; //change "select all" checked status to false
        }

        //check "select all" if all checkbox items are checked
        if ($('.checkbox:checked').length == $('.checkbox').length ){ 
            $("#select_all")[0].checked = true; //change "select all" checked status to true
        }
    });
});
</script>

您可以从我的代码中确切地看到我希望逻辑触发 Select/Deselect All 值被更改的位置。我只是不知道这样做的正确语法。

提前谢谢你。

【问题讨论】:

  • 为此使用三元运算符
  • 弗雷德,让我无知...我不知道三元运算符是什么。
  • php => php.net/manual/en/language.operators.comparison.php 在“三元...”下 ;-) 即那里的例子:$action = (empty($_POST['action'])) ? 'default' : $_POST['action']; - 你可以用isset替换它。
  • 谢谢你@Fred-ii-你能发布一个答案,所以我可以给你信用,拜托。

标签: javascript php jquery html checkbox


【解决方案1】:

“谢谢@Fred-ii-你能不能发个答案让我给你点赞。- Murphy1976”

根据 OP 的要求。

php => http://php.net/manual/en/language.operators.comparison.php 在“三元...”下;-)

即那里的例子:

$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];

您可以将其替换为 isset(),它应该用于复选框/收音机。

根据我个人的经验,当我从数据库中获取数据并检查/取消检查时,我发现使用三元运算符是最好的方法。

这有点棘手,但效果很好。

其他参考资料:

【讨论】:

  • 好的...让我们看看我是否得到了这个....在我最初的 PHP 中,我设置了一个变量 $checked = "";然后在 WHILE 循环中,我进行检查(如果 $active == '1',然后将 $checked 设置为“checked”),最后对于实际的复选框,我输入以下内容() 查找 $checked 变量并将其设置为之前的声明值。我说得对吗?
  • @Murphy1976 快速示例:$check = (isset($row['col'])) ? "default" : "{$row['col']}&gt;"; 不过你需要修改它。
  • 好的,我实际上找到了另一个可能不是最佳实践的解决方案,但我仍然觉得这是最佳实践解决方案。感谢您的帮助,谢谢。
  • $checked = ($yesno) ? 'checked="checked"' : ''; @Murphy1976 从sitepoint.com/community/t/… 中提取 - 另见stackoverflow.com/a/39304227/1415724
【解决方案2】:

到目前为止,这不是最佳做法,但它确实有效。我已将 Fred -ii- 答案标记为正确,所以请回答我的答案。如果您想要快速而肮脏的版本,这就是我想出的。

在我最初的 PHP 块中,我声明了一个变量 $checked 并将其设置为 "" 空。 在我的 WHILE 循环中,我检查所有进入的行,如果其中任何一个处于活动状态,那么我将 $checked 设置为“checked” 在我的实际复选框中,我有一个简单地回显该变量的 PHP 块。 这是我的最终代码:

<?php
    $checked = "";

    while( $row = mysql_fetch_array($result) ){
        $id = $row['id'];
        $active = $row['active'];
        $name = $row['name'];
        $class = $row['class'];

        if($active == '1'){
            $checked = "checked";
        }


        echo "<input type='hidden' name='activate_".$id."' value='0'>";
        echo "<label class='switch'><input type='checkbox' class='checkbox' name='activate_".$id."' value='1'";

        if($active == '1'){
            echo "checked='checked'";
        }

        echo "/><div class='slider'></div><span>" . $name . "</span></label>";

    }

mysql_close();

?>
<label for="select_all" class="selectAllLabel"><input type="checkbox" id="select_all" <?php echo $checked; ?>/> Activate/Deactivate All</label>
<input type="submit" class="submit" name="submit" value="Update Active Roster">
</form>
 <iframe src="index.html" width="376" height="260" style="border: 0;"></iframe>

<?php

    if(isset($_POST['submit'])){

        require "config.php";

        $conn = new mysqli($db_host, $db_user, $db_pass, $db_name);
        if ($conn->connect_error) {
            die("Connection failed: " . $conn->connect_error);
        } 

        for ($i = 1; $i<count($_POST); $i++){
            $sql = "UPDATE roster SET active = ".$_POST["activate_$i"]." WHERE id = ".$i;
            if ($conn->query($sql) === TRUE) {
                echo "";
            } else {
                echo $conn->error;
            }
        }

        $conn->close();
        echo "<meta http-equiv='refresh' content='0'>";

    }

?>
<script>

就像我在开头所说的那样,这是一种快速而肮脏的方式,而三元运算符是最佳实践。

【讨论】:

    猜你喜欢
    • 2018-03-22
    • 2013-12-14
    • 2021-05-17
    • 1970-01-01
    • 2021-08-12
    • 2016-06-19
    • 1970-01-01
    • 2021-09-27
    • 2011-03-11
    相关资源
    最近更新 更多