我有一个字段名称为Shift_Trig
的表格,其中包含true
或false
形式的1
或0
值{1}}。我有一个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\">
,但现在我的每一个复选框都显示为已选中。
答案 0 :(得分:1)
您需要在HTML中为复选框指定一个显式索引:
$i = 0;
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=\"checkbox\" name=\"Shift_Trig[$i]\"";
if($shift_query['Shift_Trig'] == '1')
{
echo " checked=\"checked\"";
}
echo " value=\"1\"></td>";
echo "<td><input type=\"checkbox\" name=\"deleteBox[$i]\"></td>";
echo "</tr>";
$i++;
}
在更新代码中,在循环开始时,执行:
if (!isset($trig[$i])) { $trig[$i] = 0; }
更新代码的其余部分保持不变。