【问题标题】:Updating checkboxes with php and mysqli使用 php 和 mysqli 更新复选框
【发布时间】:2012-08-30 18:17:57
【问题描述】:

目标:允许用户从可用的复选框列表中选择项目,并附加 id 更新数据库。在 $_POST 之后,检查所选择的项目。

问题:提交表单后,会返回之前的一组复选框,而不是当前的。如果再次提交表单而不更改任何内容,则新的复选框集现在可用。基本上,新值只会在提交按钮被按下两次后才会显示。

代码: 查询数据库以使用复选框填充表单的函数...

function chCheck($conn){
$sql = "Select CHEESE, ID, OnMenu from CheeseSelections";
$result=$conn->query($sql);
    while($row=$result->fetch_assoc())
        {   
            if ($row['OnMenu']==="True"){
                $str =  "<input type='checkbox' name='chList[]' value='".$row['ID']."' id='".$row['CHEESE']."' checked/>";
                $str .= "<label for ='".$row['CHEESE']."'>".$row['CHEESE']."</label>";
                $str .= " <a href=\"#\">view/edit item</a><br />";  
                echo $str;
                }
            elseif ($row['OnMenu']==="False"){
                $str =  "<input type='checkbox' name='chList[]' value='".$row['ID']."' id='".$row['CHEESE'];
                $str .= "/> <label for ='".$row['CHEESE']."'>".$row['CHEESE']."</label>";
                $str .= " <a href=\"#\">view/edit item</a><br />";  
                echo $str;
                }
        }

}

HTML

 <form name="chCheck" method="post" action="">
        <?php chCheck($conn); ?>
        <input type="submit" name="update" value="Update Selections"></br>  
    </form>

$_POST

if ($_POST) 
    {
        $ids = $_POST['chList'];

                $sql = "UPDATE CheeseSelections SET CheeseSelections.OnMenu = \"False\";";
        foreach($ids as $items){        
                $sql .= "UPDATE CheeseSelections SET CheeseSelections.OnMenu = \"True\" WHERE CheeseSelections.ID IN (".$items."); ";
                    }       
        //echo $sql;

        mysqli_multi_query($conn, $sql);
        mysqli_query($conn, $sql);
        printf("Affected rows (UPDATE): %d\n", $conn->affected_rows);

        printf("Error Code: %d\n", $conn->errno);
    }

逻辑:提交时,“OnMenu”的整列设置为“False”。然后将 $_POST 中收集的 ID 设置为“True”。这将取消设置然后重置列。这个逻辑合理吗?我应该做些什么不同的事情?

谢谢。

【问题讨论】:

  • 更新数据库的代码是否正常工作?它是在生成表单的 HTML 之前调用的吗?
  • @andrewsi - 是的,查询在数据库中有效。页面格式的方式反映了上面的顺序。复选框填充功能位于 html 标记之前,表单位于 html 内部,$_POST 位于结束 html 标记之前。
  • andrewsi - 你的回答很有意义和@Revent - 你的回答内容丰富且具有教育意义。但是,当我将 $_POST 处理放在脚本顶部、函数脚本上方或下方时,我会收到 chCheck() 函数的“非对象上的函数 fetch_assoc()”错误。
  • 你没有明确地关闭你的连接,是吗?
  • 没有。我没有关闭连接。

标签: php database mysqli


【解决方案1】:

有几件事我会做不同的事情。首先,作为最佳实践,当唯一的区别是选中状态时,避免重复输入框。目前,如果您决定进行更改,则必须在两个地方进行更改。

function chCheck($conn)
{
    $sql = "Select CHEESE, ID, OnMenu from CheeseSelections";
    $result=$conn->query($sql);
    while($row=$result->fetch_assoc())
    {   
        $selected = ($row['OnMenu'] === "True" ? ' checked="checked"' : '');
        echo '<input type="checkbox" name="chList[]" value="'.$row['ID'].'" id="'.$row['CHEESE'].'"'.$selected.' /><label for="'.$row['CHEESE'].'">'.htmlentities($row['CHEESE']).'</label> <a href="#">view/edit item</a><br />';               
    }
}

其次,HTML 复选框在未选中时不会像单选按钮那样发布值。在 POST 上,我会首先清除所有值(将所有数据库值设置为 False),然后遍历发布的值,将它们放入数组中,然后调用单个查询将它们设置为 True。

$item_ids = array();
foreach ($ids as $item)
    $item_ids[] = intval($item);  // to prevent $_POST data type tampering

$sql .= "UPDATE CheeseSelections SET CheeseSelections.OnMenu = 'True' WHERE CheeseSelections.ID IN (".implode(",",$item_ids)."); ";

确保您的 $_POST 处理代码也位于函数调用上方的脚本顶部。这可能是您所看到的行为的原因。

我也会避免将布尔值存储为文本,因此我会使用 TinyInt(1) 数据类型并将其设置为 0 或 1,而不是使用文本值“True”和“False”。它只是更有效率。

【讨论】:

    【解决方案2】:

    你的程序逻辑有问题。

    您正在为表单生成 HTML,然后在最后运行 SQL 更新。当用户单击提交并创建下一页时,数据库查询返回他们现有的选择,并相应地生成 HTML。最后,$_POST 被处理,数据库更新——所以在页面生成之前它不会更新。

    尝试将整个 $_POST if 语句移到调用 chCheck() 之前

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 2015-01-31
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多