【问题标题】:Posting checkbox with html/php values does not work in all cases使用 html/php 值发布复选框并非在所有情况下都有效
【发布时间】:2015-08-23 16:24:46
【问题描述】:

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

使用 mysqli 调用 db 填充该表。到目前为止一切顺利。

表格的摘录如下所示(我试图只显示代码的“重要”部分以避免混乱 - 每个项目还有 8 个类似于“nytAntalGangeUdfoert”的文本字段)

<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)决定复选框是否应显示为已选中(活动或不活动)这工作正常。

然后我有“重复”隐藏字段来记录复选框的原始状态,以便在发布后进行比较:

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

所有这些都发布到另一个页面,并按如下方式处理(同样,仅是完整表格的摘录)。 'aktivstatus' 是来自 db 的旧状态,而 'nyaktivstatus' 是发布的状态(即用户通过复选框选择的状态 - 当然可以与原始状态相同)

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,这很好用...不是理想的解决方案,但...

所以,我猜在发布/分配“nyaktivstatus”(用户输入状态)时出了点问题

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

谢谢!

【问题讨论】:

标签: php html checkbox


【解决方案1】:

$aktivStatus 如果未勾选复选框,则可能根本不会设置。

在您有 $aktivStatus = $_POST["aktivStatus"]; 的地方尝试将其替换为:

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

这样,如果未设置复选框并且浏览器根本没有POST它,您的变量将假定0,否则它将假定值POSTed 通过浏览器。

【讨论】:

  • 嗨 Dedee - 感谢您的意见。不幸的是,它产生了与我自己的方法相同的结果 if(isset($_POST["nyAktivStatus"][$n])) { $nyAktivStatus[$n] = 1; } 其他 { $nyAktivStatus[$n] = 0;我得到了所有的 nyaktivstatus 和 aktivstatus 变量(我没有得到'null''missing',但由于某种原因,aktivstatus/nyaktivstatus 被分配到错误的行......
  • 我看到你编辑了代码,但部分。 $navn 在哪里发起?多重比较也应该分开,你在同一个括号内做了一些比较,给你一个想法:if (($x &lt;&gt; $y) || ($a &lt;&gt; $b)) {}。另外,只需foreach($navn as $n)
  • 这不会按照我们希望的方式工作。同样,如果用户取消选中并尝试发送数据,结果将是相同的。因为数组将在没有未选中复选框的值的情况下移动。所以我们不知道实际选中了哪些复选框,因为创建后数组时只考虑了选中的复选框。
  • @DeDee,$navn 是在 $antalGangeUdfoert =... 部分之前启动的(上面未显示)实际上,我意识到我将错误的代码复制到了我的评论中。事实上,我确实按照你的建议做了,但得到的结果与我自己的 isset-approach 相同。我相信我自己的方法或您的方法应该会产生适当的结果。但它没有:(
  • @aimme,您是否暗示我得到奇怪结果的原因是例如如果数组 1 具有 active=unchecked,则该值将被其他值替换并且不为空/空?
【解决方案2】:

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

<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>

这是表格

<?php
//uncomment for debugging
//if(isset($_POST)){
//for debugging could use this to see the variables that were passed on form submit
//echo '<pre>'; print_r($_POST); echo'</pre>';
//on post of data remember to sanitize and do the checks here server side.
//as we used javascript on the form for checkboxes and hidden text box should varify those post data on server side here.for example whether the check box array count and value matches..
//;}
?>
<form action="" method="post" enctype="application/x-www-form-urlencoded">
<table>
<tr>
<?php
//sample data as if it came from db
$antalGangeUdfoert=array('a','b','c','d','x','y','z');
//sample data as if it came from db
$aktivStatus=array(0,0,1,0,1,1,0);
?>
<?php
$i=0;
//could use a for loop after counting the fetched rows,
//could use other than $aktivStatus, i used $aktivStatus here 
foreach($aktivStatus as $aktivStatus){
echo  '<td><input type="text" name="nytAntalGangeUdfoert['.$i.']" value="'.$antalGangeUdfoert[$i].'"></td><td>';
//check whether its checked depending on activeStatus 
$aktivStatus[$i] == 1? $check='1':$check="0";
//and according to check draw a check box and a hidden text for each
echo '<input type="hidden" id="hidden['.$i.']" name="nyAktivStatus['.$i.']" value="'.$check.'"/>
<input type="checkbox" id="checkbox'.$i.'" value="'.$aktivStatus[$i].'" checked="'.$check.'" onChange="changed(this.id);"/>';
$i++;
};
?>
</td></tr></table>
<input type="submit" name="sub" value="sub"/>
</form>

【讨论】:

  • 感谢您的输入 - 不过,我还是个 php 新手,所以在深入研究 javascript 之前,我想在这方面做得更好 :)
  • 我发现仅使用 php 是不可能的,而不使用 javascript(包括或不包括库),因为您想发送实际认为在 html 中不存在的数据。我的意思是复选框未选中发布时不考虑。如果我自己也有任何方法可以做到这一点,我将不胜感激。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 2020-01-13
  • 2018-05-15
  • 2017-05-28
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
相关资源
最近更新 更多