php
  • html
  • forms
  • checkbox
  • 2012-09-19 80 views -1 likes 
    -1

    Morning All,请帮我调试这个php代码

    我有一个表格,我正在使用一次向数据库添加多行。这一切似乎工作正常,除了复选框。每个表格行都有一个复选框。无论勾选哪个复选框,结果总是在提交后以相同的顺序返回。

    这里是形式的主要部分的事项:

    <tr> 
    <td class='border'> 
    <input type='text' name='rowid[]' value='".$row."' style='display:none;' /> 
    <input type='text' name='ref[]' style='width:100%;' /> 
    </td> 
    <td class='border'> 
    <input type='text' name='obs[]' style='width:100%;' /> 
    </td> 
    <td class='border'> 
    <input type='text' name='act[]' style='width:100%;' /> 
    </td> 
    <td class='border' align='center'> 
    <input type='checkbox' name='comp[]' value='Yes' /> 
    </td> 
    <td class='border'> 
    <input type='text' name='compby[]' style='width:100%;' /> 
    </td> 
    <td class='border'> 
    <input type='text' name='compdate[]' id='completeddate".$row."' class='completeddate' style='width:100%;' /> 
    </td> 
    </tr> 
    

    这种形式被提交,并用它在我的PHP代码交易。您可以看到第一个输入是表单行的ID。这是一个隐藏字段,对于窗体中显示的每一行,值都会递增1。

    一旦提交表单,我用下面的PHP,每行,一个让交易在时间

    foreach($_POST['rowid'] as $key=>$rowid) { 
    

    这应该基本上说,对于一个rowid,输入端的其余相关,直到它到达下一个rowid。

    如果我再印说

    echo $_POST['ref'][$key]; 
    

    我会得到第一行的引用,然后一旦循环完成,再打印出来,我会得到第二行的引用,等等。

    但是,如果我把

    echo $_POST['comp'][$key]; 
    

    那么这就是它打破。

    比方说,例如,对于每一行我选中的复选框顺序如下:

    row 1, tick, row 2, untick, row 3, tick 
    

    如果我然后让循环打印出所有的复选框的值,它会显示

    'Yes', 'Yes', '' 
    

    但它应该在这个顺序

    'Yes', '', 'Yes' 
    

    这是因为复选框是正常的一个无论如何,我会把它放到另一个数组中,通过给它一个comp []的名字?

    反正有没有这个问题,或者我会更好有单选按钮,一个是的,一个是不是?

    非常感谢

    +0

    ühhhh...''rowid []'!='rowid'' – 2012-09-19 10:22:10

    +0

    使用'print_r($ _ POST)'当您点击提交并显示结果... – Night2

    +0

    当您提交表单时,只发送检查值...所以如果你计算$ _POST ['comp']的数量,你会看到这个数字等于你的表格中检查的数字,然后你不提交复选框的数量....你可以有不同的名称对于每个复选框行comp_1或类似的东西 – Surace

    回答

    1

    在窗体中创建技术隐藏字段的正确方法是使用hidden类型。无论如何,你不需要这个领域。相反,使用$row在各领域的正确识别它们:

    <tr> 
    <td class='border'> 
    <input type='text' name='ref[<?php echo $row; ?>]' style='width:100%;' /> 
    </td> 
    <td class='border'> 
    <input type='text' name='obs[<?php echo $row; ?>]' style='width:100%;' /> 
    </td> 
    <td class='border'> 
    <input type='text' name='act[<?php echo $row; ?>]' style='width:100%;' /> 
    </td> 
    <td class='border' align='center'> 
    <input type='checkbox' name='comp[<?php echo $row; ?>]' value='Yes' /> 
    </td> 
    <td class='border'> 
    <input type='text' name='compby[<?php echo $row; ?>]' style='width:100%;' /> 
    </td> 
    <td class='border'> 
    <input type='text' name='compdate[<?php echo $row; ?>]' id='completeddate<?php echo $row; ?>' class='completeddate' style='width:100%;' /> 
    </td> 
    </tr> 
    

    更改循环(rowid场不再存在)。你可以在任何你text领域的循环,因为它们即便是空的(与复选框场,检查时只提交)提交:

    foreach($_POST['ref'] as $key => $rowid) { 
    

    检查你的PHP代码,可能有更多的事情更新。

    +0

    感谢您的意见,我认为这将最终成为我应该走的路! – Eds

    1

    尝试下标数组索引。即通过将其更改为comp[$row]来明确哪个comp[]属于哪一行。问题在于未发送未选中的框,因此当没有选中所有框时,请求中只有2个comp[]元素,并且您无法知道它们属于哪个行。

    顺便说一句,当您访问$_POST['comp'][$key]最后一个(不存在的)$key时,您应该会收到警告。如果不是,则启用所有警告。警告通常非常有用。

    +0

    感谢您的评论。在复选框数组(comp [])中添加一个数字将作为一种快速和肮脏的方式来完成我所需要的工作。 – Eds

    +0

    对不起,这与我接受的答案基本相同,所以任何一个答案都可以被接受。不过,我会考虑转向警告。谢谢 – Eds

    +0

    @Eds的确是的,但不仅仅是“一个数字...快速和肮脏”,但实际的行ID。关于接受NP虽然我是7分钟前;-) – mvds

    相关问题