【发布时间】:2012-12-10 05:23:14
【问题描述】:
我有一个字段名称为Shift_Trig 的表,该表意味着以1 或0 的形式输入true 或false 值。我有一个 html 表单,每行都有一个复选框,选中后,应在字段中输入 1。我还希望该复选框反映存储在数据库中 Shift_Trig 字段中的当前值。
我当前代码遇到的问题是,每当我 UPDATE Shift_Trig 字段时,我都没有得到我想要的结果。例如,如果我选择:
----------------------
| ROW 1 | false |
----------------------
| ROW 2 | true |
----------------------
| ROW 3 | false |
----------------------
| ROW 4 | true |
----------------------
| ROW 5 | true |
----------------------
它会像这样UPDATE:
----------------------
| ROW 1 | true |
----------------------
| ROW 2 | true |
----------------------
| ROW 3 | true |
----------------------
| ROW 4 | false |
----------------------
| ROW 5 | false |
----------------------
这是我的表单代码:
while($shift_query = $result_shift_query->fetch_assoc())
{
echo "<tr>";
echo "<td><input type=\"hidden\" name=\"Shift_ID[]\"></td>";
echo "<td><input type=\"text\" name=\"Shift_Name[]\"></td>";
echo "<td><input type=\"text\" name=\"Shift_Short_Name[]\"></td>";
echo "<td><input type=\"text\" name=\"Shift_Color[]\"></td>";
echo "<td><input type=\"hidden\" name=\"Shift_Trig[]\" value=\"0\"><input type=\"checkbox\" name=\"Shift_Trig[]\"";
if($shift_query['Shift_Trig'] == '1')
{
echo " checked=\"checked\"";
}
echo " value=\"1\"></td>";
echo "<td><input type=\"checkbox\" name=\"deleteBox[]\"></td>";
echo "</tr>";
}
这是我的UPDATE 代码:
if(isset($_POST['update_submit']))
{
$id = $_POST['Shift_ID'];
$name = $_POST['Shift_Name'];
$short_name = $_POST['Shift_Short_Name'];
$color = $_POST['Shift_Color'];
$trig = $_POST['Shift_Trig'];
$i = 0;
foreach($id as $update)
{
$sql = ("UPDATE shift SET Shift_Name = '$name[$i]', Shift_Short_Name = '$short_name[$i]', Shift_Color = '$color[$i]', Shift_Trig = '$trig[$i]' WHERE Shift_ID = '$update'");
if(!$result_shift_update = $mysqli->query($sql))
{
die = ("There was an error updating the shift table [" . $mysqli->error . "]");
}
echo "sql: " . $sql . "<br>";
$i++;
}
我删除了一些代码以使其更易于阅读,例如使用数据库中的字段数据填充文本框的位置。
当我在表单中选择第 2 行和第 3 行,然后回显 $sql 语句时,我得到了这个:
sql: UPDATE shift SET Shift_Name = 'None', Shift_Short_Name = 'None', Shift_Color = '#FF0000', Shift_Trig = '1' WHERE Shift_ID = '1'
sql: UPDATE shift SET Shift_Name = 'Morning (05:30 - 14:30)', Shift_Short_Name = 'AM', Shift_Color = '#FFF8AF', Shift_Trig = '1' WHERE Shift_ID = '2'
sql: UPDATE shift SET Shift_Name = 'Evening (14:30 - 23:30)', Shift_Short_Name = 'PM', Shift_Color = '#AF9BCF', Shift_Trig = '' WHERE Shift_ID = '3'
sql: UPDATE shift SET Shift_Name = 'General (07:30 - 17:30)', Shift_Short_Name = 'GEN', Shift_Color = '#ABFFB3', Shift_Trig = '' WHERE Shift_ID = '4'
sql: UPDATE shift SET Shift_Name = 'Night (18:00 - 06:00)', Shift_Short_Name = 'EMMA', Shift_Color = '#BFFAFF', Shift_Trig = '' WHERE Shift_ID = '5'
sql: UPDATE shift SET Shift_Name = 'Training', Shift_Short_Name = 'TRN', Shift_Color = '#FFD9BF', Shift_Trig = '' WHERE Shift_ID = '6'
sql: UPDATE shift SET Shift_Name = 'Day Off', Shift_Short_Name = 'OFF', Shift_Color = '#FFD859', Shift_Trig = '' WHERE Shift_ID = '7'
发生了什么是有道理的,因为第一个复选框没有被选中,它没有被传递给$_POST 数据,但是我如何编写代码才能得到想要的结果?
编辑:我添加了:<input type=\"hidden\" name=\"Shift_Trig[]\" value=\"0\">,但现在我每隔一个复选框就会显示为选中状态。
【问题讨论】:
-
考虑这种方法:
<input type="hidden" name="Shift_Trig[$id]" value="0" /><input type="checkbox" name="Shift_Trig[$id]" value="1" $checked />。如果复选框被选中,它将覆盖隐藏的值,如果没有,隐藏的值将被发送。在我看来,在这种情况下,最合乎逻辑的$id将是班次的 ID 而不是某个索引。 (编辑:另外,查看prepared statements and bind variables。) -
@DCoder 我刚刚读到这个answer,它提出了同样的问题。我要试试。
-
@DCoder 我编辑了这个问题,由于某种原因它不起作用:/
-
您错过了隐藏输入和复选框具有相同名称的部分,基于 $id。实际上,我建议对 HTML 结构进行更彻底的更改(将每个
shift放入单独的数组中,而不是依赖这种基于索引的解决方案)。 -
啊,我知道我现在错过了 $i 的地方,这是有道理的。我不确定将每个
shift放入一个单独的数组中是什么意思,但我很想知道你的意思。如您所见,我已经标记了这个问题的解决方案,但是我仍然非常感谢您的时间和帮助:)