使用php和mysqli更新复选框

使用php和mysqli更新复选框,php,database,mysqli,Php,Database,Mysqli,目标:允许用户从可用的复选框列表中选择项目,并将附加的id更新数据库。$\u POST后,将检查所选项目 问题:提交表单后,将返回上一组复选框,而不是当前复选框。如果再次提交表单而不做任何更改,则新的复选框集现在可用。基本上,新值仅在按下提交btn两次后显示 代码: 函数查询数据库以使用复选框填充表单 function chCheck($conn){ $sql = "Select CHEESE, ID, OnMenu from CheeseSelections"; $result=$conn-&

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

问题:提交表单后,将返回上一组复选框,而不是当前复选框。如果再次提交表单而不做任何更改,则新的复选框集现在可用。基本上,新值仅在按下提交btn两次后显示

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

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;
                }
        }
逻辑:提交时,“OnMenu”的整列设置为“False”。然后,从$u POST收集的ID设置为“True”。这将取消设置列,然后重置列。这个逻辑合理吗?我应该做些什么不同的事情


谢谢。

您的程序逻辑有问题

您正在为表单生成HTML,然后在最后运行SQL更新。当用户单击submit并创建下一个页面时,数据库查询将返回他们现有的选择,并相应地生成HTML。最后,将处理$\u POST,并更新数据库-因此在生成页面之前不会更新


在调用
chCheck()

程序逻辑出现问题之前,尝试将整个
$\u POST
if语句移动到

您正在为表单生成HTML,然后在最后运行SQL更新。当用户单击submit并创建下一个页面时,数据库查询将返回他们现有的选择,并相应地生成HTML。最后,将处理$\u POST,并更新数据库-因此在生成页面之前不会更新


在调用
chCheck()

之前,尝试将整个
$\u POST
if语句移动到。首先,作为最佳实践,当唯一的区别是选中状态时,避免重复输入框。目前,如果你决定做出改变,你必须在两个地方做出改变

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 />';               
    }
}
确保$\u POST处理代码也位于函数调用上方的脚本顶部。这可能是你看到的行为的原因


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

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

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 />';               
    }
}
确保$\u POST处理代码也位于函数调用上方的脚本顶部。这可能是你看到的行为的原因


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

更新数据库的代码是否正常工作?是否在生成表单的HTML之前调用它?@andrewsi-是的,查询在数据库中工作。页面的格式化方式反映了上述顺序。复选框填充函数位于html标记之前,表单位于html内部,$\u POST位于结束html标记之前。andrewsi-您的答案有意义&@Revent-您的答案信息丰富且具有教育意义。但是,当我将$_postprocessing放在脚本的顶部、函数脚本的上方或下方时,我会收到chCheck()函数的“非对象上的函数fetch_assoc()”错误。您没有在某个地方显式关闭连接,是吗?不是。我没有关闭连接。更新数据库的代码是否正常工作?是否在生成表单的HTML之前调用它?@andrewsi-是的,查询在数据库中工作。页面的格式化方式反映了上述顺序。复选框填充函数位于html标记之前,表单位于html内部,$\u POST位于结束html标记之前。andrewsi-您的答案有意义&@Revent-您的答案信息丰富且具有教育意义。但是,当我将$_postprocessing放在脚本的顶部、函数脚本的上方或下方时,我会收到chCheck()函数的“非对象上的函数fetch_assoc()”错误。您没有在某个地方显式关闭连接,是吗?不,我没有关闭连接。
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 />';               
    }
}
$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)."); ";