目标:允许用户从可用的复选框列表中选择项目,并附加ID以更新数据库。在$ _POST之后,选中所选项目。
问题:提交表单后,将返回PREVIOUS复选框集,而不是当前复选框。如果再次提交表单而不更改任何内容,则现在可以使用新的复选框集。基本上,只有在按两次提交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;
}
}
}
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”。这会取消设置然后重置列。这个逻辑是否合理?我应该做些什么?
谢谢。
答案 0 :(得分: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”的文本值。它效率更高。
答案 1 :(得分:0)
您的程序逻辑存在问题。
您正在为表单生成HTML,然后在最后运行SQL更新。当用户单击“提交”并创建下一页时,数据库查询将返回其现有选项,并相应地生成HTML。最后,$ _POST被处理,数据库更新 - 所以在页面已经生成之前它不会更新。
在致电$_POST
chCheck()
if语句移至