使用html / php值发布复选框并不适用于所有情况

时间:2015-08-22 18:12:28

标签: php html checkbox

所以,我的网页有一个html表,显示一行pr。行包括列中有关该项目的各种数据。

使用对db的mysqli调用填充表。到目前为止一切都很好。

表的摘录看起来像这样(我试图只显示"重要的"部分代码以避免混乱 - 还有8个类似于&#34的文本字段; nytAntalGangeUdfoert&# 34;每个项目)

<td><input type="text" name="nytAntalGangeUdfoert[]" value="<?php echo $antalGangeUdfoert ?>"></td>

<?php if ($aktivStatus == 1) { ?>
    <td><input type="checkbox" name="nyAktivStatus[]" value="<?php echo $aktivStatus ?>" checked="checked"/></td>
<?php } else { ?>
    <td><input type="checkbox" name="nyAktivStatus[]" value="<?php echo $aktivStatus ?>" /></td>

文本字段在各个方面都运行良好。

对于复选框,if-else部分决定复选框是否应显示为已检查(活动与否),这取决于我的db-table(1或0)中的值。这样可以正常工作。

然后我重复了#39;隐藏字段以记录复选框的原始状态,以便在发布后进行比较:

<td><input type="hidden" name="antalGangeUdfoert[]" value="<?php echo $antalGangeUdfoert ?>"></td>
<td><input type="hidden" name="aktivStatus[]" value="<?php echo $aktivStatus ?>"></td>

所有这些都被发布到另一个页面,其处理方式如下(再次,只有完整表的摘录)。 &#39; aktivstatus&#39;是db的旧状态,&nbspaktivstatus&#39;是发布的(即用户通过复选框选择的那个 - 当然可以与原始状态相同)

if(isset($_POST['submit']))
{
    $antalGangeUdfoert = $_POST["antalGangeUdfoert"];
    $nytAntalGangeUdfoert = $_POST["nytAntalGangeUdfoert"];
    $aktivStatus = $_POST["aktivStatus"];

    foreach( $navn as $n => $n )
    {
        if(isset($_POST["nyAktivStatus"][$n])) {
            $nyAktivStatus[$n] = 1;
        } else {
            $nyAktivStatus[$n] = 0;
        }
        if( $antalGangeUdfoert[$n] <> $nytantalGangeUdfoert[$n] || $aktivStatus[$n] <> $nyAktivStatus[$n]) {
//run function to update items where a change has been made by the user)

如前所述,上述方法适用于所有文本字段,但在某些情况下,复选框的新状态会保存为错误的项目,显然(无论文本字段的更改是否正确保存在db中)

以下示例:

行---获取状态---用户输入---保存为

Row1: 1-->0-->1 ERROR
Row2: 1-->1-->1 OK
Row3: 1-->1-->0 ERROR


Row1: 1-->1-->1 OK
Row2: 1-->1-->1 OK
Row3: 0-->1-->1 OK


Row1: 1-->0-->0 OK
Row2: 1-->0-->0 OK
Row3: 1-->0-->0 OK


Row1: 0-->1-->1 OK
Row2: 0-->1-->1 OK
Row3: 0-->1-->1 OK


Row1: 1-->0-->1 ERROR
Row2: 1-->0-->0 OK
Row3: 1-->1-->0 ERROR

仅供参考,我将复选框更改为文本字段并手动输入1或0,这很好......虽然不是理想的解决方案......

所以,我想在发布/分配&#34; nyaktivstatus&#39;时会出现问题。 (用户输入状态)

有人能在我的代码中发现问题吗?或者发现一种我没有看到的模式?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果没有勾选复选框,则可能根本不设置{p> $aktivStatus

$aktivStatus = $_POST["aktivStatus"];尝试将其替换为:

if (!array_key_exists('aktivStatus',$_POST))
    $aktivStatus = 0;
else
    $aktivStatus = $_POST["aktivStatus"];

这样一来,如果没有设置复选框且浏览器根本没有 POST ,那么你的变量将假定为0,否则它将假定值 POSTed < / em>通过浏览器。

答案 1 :(得分:0)

由于未经检查的复选框未在帖子上进行,因此在这种情况下,我们可能会使用一些小的javascript将复选框的值带到复选框的on change事件上的相应隐藏文本框中。这是一个示例javascript,与下面的表单保持在同一页面上。此代码是如何实现提问者目标的演示。可能有其他方法来实现这一目标。会话也可用于某些部分。

lookupALot

这是表格

<script type="text/javascript">
function changed(id){
    var checkBoxValue=document.getElementById(id).value;
    id=id.replace('checkbox','');
    hTextBoxid='hidden['+id+']';
    var hiddenTextBox=document.getElementById(hTextBoxid);
    hiddenTextBox.value=checkBoxValue;
}
</script>