如何使用复选框在 mySQL 中输入 true (1) 或 false (0) 并显示为在 php / html 表单中选中?
Posted
技术标签:
【中文标题】如何使用复选框在 mySQL 中输入 true (1) 或 false (0) 并显示为在 php / html 表单中选中?【英文标题】:How to use checkboxes to enter true (1) or false (0) into mySQL AND show as checked in php / html form? 【发布时间】: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
放入一个单独的数组中是什么意思,但我很想知道你的意思。如您所见,我已经标记了这个问题的解决方案,但是我仍然非常感谢您的时间和帮助:)
【参考方案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;
其余更新代码不变。
【讨论】:
感谢您的回复。你能告诉我UPDATE
查询是什么样的吗?
解决了!我将其标记为已解决,感谢您的帮助,我今天学到了一些有价值的东西!以上是关于如何使用复选框在 mySQL 中输入 true (1) 或 false (0) 并显示为在 php / html 表单中选中?的主要内容,如果未能解决你的问题,请参考以下文章