如何使用复选框在 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 的表,该表意味着以10 的形式输入truefalse 值。我有一个 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 数据,但是我如何编写代码才能得到想要的结果?

编辑:我添加了:&lt;input type=\"hidden\" name=\"Shift_Trig[]\" value=\"0\"&gt;,但现在我每隔一个复选框就会显示为选中状态。

【问题讨论】:

考虑这种方法:&lt;input type="hidden" name="Shift_Trig[$id]" value="0" /&gt;&lt;input type="checkbox" name="Shift_Trig[$id]" value="1" $checked /&gt;。如果复选框被选中,它将覆盖隐藏的值,如果没有,隐藏的值将被发送。在我看来,在这种情况下,最合乎逻辑的$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 表单中选中?的主要内容,如果未能解决你的问题,请参考以下文章

复选框 True/False - 添加到计算

输入复选框true或选中或是[重复]

如果 MYSQL 列值为 true,则选中复选框

ngModel 不适用于 ngFor 中的输入类型复选框

如何将表单中的复选框序列化为Json数据

Rails 6:如何在 collection_check_boxes 中要求至少一个复选框