【发布时间】: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()”错误。
-
你没有明确地关闭你的连接,是吗?
-
没有。我没有关闭连接。