所以,我的网页有一个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;时会出现问题。 (用户输入状态)
有人能在我的代码中发现问题吗?或者发现一种我没有看到的模式?
谢谢!
答案 0 :(得分:1)
$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>