如何将一组选中/未选中的复选框值传递给 PHP 电子邮件生成器?

Posted

技术标签:

【中文标题】如何将一组选中/未选中的复选框值传递给 PHP 电子邮件生成器?【英文标题】:How to pass an array of checked/unchecked checkbox values to PHP email generator? 【发布时间】:2011-09-16 14:16:19 【问题描述】:

我在表单中添加了一个复选框,用户可以向其中动态添加行。可以看到here的表格。

我使用一个数组将每一行的值传递给 php 电子邮件生成器,其他输入都可以正常工作,但我无法让复选框工作。复选框输入当前如下所示:

<input type="checkbox" name="mailing[]" value="Yes">

然后在 PHP 中我有这个:

$mailing = trim(stripslashes($_POST['mailing'][$i]));

但它没有按预期工作,即我只看到选中的第一个复选框为“是”,而后续选中的复选框则没有。

另一个问题是我希望为未选中的复选框生成值“否”。

有人可以帮忙吗?

谢谢,

尼克

表格:

<form method="post" action="bookingenginetest.php">
            <p>
                <input type="checkbox" name="mailing[]" value="Yes">
                <label>Full Name:</label> <input type="text" name="name[]">
                <label>Email:</label> <input type="text" name="email[]">
                <label>Telephone:</label> <input type="text" name="telephone[]">
                <span class="remove">Remove</span>
            </p>
            <p>
                <span class="add">Add person</span><br /><br /><input type="submit" name="submit" id="submit" value="Submit" class="submit-button" />
            </p>

        </form>

克隆脚本:

$(document).ready(function() 

                $(".add").click(function() 
                    var x = $("form > p:first-child").clone(true).insertBefore("form > p:last-child");
                    x.find('input').each(function()  this.value = ''; );
                    return false;
                );

                $(".remove").click(function() 
                    $(this).parent().remove();
                );

            );

【问题讨论】:

未选中的复选框不会与表单的其余部分一起提交。如果您想要“否”,则必须跟踪表单上的复选框并列出未选中的复选框。另一种方法是在提交时使用一些 javascript 来遍历所有复选框并建立一个未选中的列表并将该值作为另一个表单字段提交。 建议通过添加 'checked' 属性使每个新行默认为“选中”,这样用户提交未选中行的可能性就会降低。 &lt;input type="checkbox" name="mailing[]" value="" checked /&gt; 【参考方案1】:
$mailing = array();
foreach($_POST as $v)
    $mailing[] = trim(stripslashes($v));

要处理未选中的框,最好为每个复选框设置一个唯一值:

<input type="checkbox" name="mailing[1]" value="Yes">
<input type="checkbox" name="mailing[2]" value="Yes">

<input type="checkbox" name="mailing[a]" value="Yes">
<input type="checkbox" name="mailing[b]" value="Yes">

然后有一个复选框列表:

$boxes = array(1,2,3);
$mailing = array();
$p = array_key_exists('mailing',$_POST) ? $_POST['mailing'] : array();
foreach($boxes as $v)
    if(array_key_exists($v,$p))
        $mailing[$v] = trim(stripslashes($p[$v]));
    else
        $mailing[$v] = 'No';
    


print_r($mailing);

您也可以将其与多个复选框一起使用:

$boxes = 3;
$mailing = array();
$p = array_key_exists('mailing',$_POST) ? $_POST['mailing'] : array();
for($v = 0; $v < $boxes; $v++)
    if(array_key_exists($v,$p))
        $mailing[$v] = trim(stripslashes($p[$v]));
    else
        $mailing[$v] = 'No';
    


print_r($mailing);

【讨论】:

谢谢。这种方法可以与我用来动态添加行的克隆方法一起使用吗? @Nick:只要您保留某种运行索引并在您动态添加一行时将其递增并在删除一行时递减它)。您需要向脚本发送复选框的总数并稍微修改我的代码以使用多个复选框而不是列表。【参考方案2】:

这是我的解决方案:

html 中有一组复选框,就像这样......

<input type="hidden" name="something[]" value="off" />
<input type="checkbox" name="something[]" />
<input type="hidden" name="something[]" value="off" />
<input type="checkbox" name="something[]" />
<input type="hidden" name="something[]" value="off" />
<input type="checkbox" name="something[]" />

然后我用这个函数修复发布的数组...

$_POST[ 'something' ] = $this->fixArrayOfCheckboxes( $_POST[ 'something' ] );
function fixArrayOfCheckboxes( $checks ) 
    $newChecks = array();
    for( $i = 0; $i < count( $checks ); $i++ ) 
        if( $checks[ $i ] == 'off' && $checks[ $i + 1 ] == 'on' ) 
            $newChecks[] = 'on';
            $i++;
        
        else 
            $newChecks[] = 'off';
        
    
    return $newChecks;

这将为我提供一个数组,其中每个(和每个)复选框的值都是“开”或“关”。

请注意,隐藏输入必须在复选框输入之前,才能使功能正常工作。

【讨论】:

【参考方案3】:

将每个复选框的值更改为唯一值:

<input type="checkbox" name="mailing[]" value="Yes-1"> 
<input type="checkbox" name="mailing[]" value="Yes-2"> 

等等。为了从您的 jQuery 代码中执行此操作,添加另一行,将值分配给新复选框:

x.find('input:checkbox').each(function()  this.value='Yes-'+n; ); 

您必须在初始页面加载时定义n。假设您只从一个“人”开始,只需在您的 $(".add").click 处理程序上方添加:

var n=1;

然后:

在您的$(".add").click 处理程序中,增加n 的值 在您的$(".remove").click 处理程序中,减少n 的值

【讨论】:

@AJ 不知道该怎么做,因为表单上的后续行是使用克隆动态添加的。 更新了我的答案...你不能这样做吗? (上) @AJ 不,我不清楚如何使用克隆方法生成唯一值。我在上面的问题中添加了表单和克隆脚本。 这不是复选框的真正工作方式...如果未选中,则不会将其发送到服务器。如果您需要明确知道哪些复选框未被选中,则必须实现另一种机制来执行此操作。有不同的技术,其中之一是为每个复选框使用隐藏字段。见此链接:planetozh.com/blog/2008/09/… 我认为您可以为每个复选框分配不同的值。我会用代码更新我的答案。【参考方案4】:

要在 POST 中检查和取消检查这两个值,请放置一个名称完全相同但与原始 chkbox 值相比具有相反值的隐藏字段,这样在这种情况下该值将是 '0'

<input type="hidden" name="chk_name[]" value="0" />
<input type="checkbox"  name="chk_name[]"  value="1"/>
 <input type="hidden" name="chk_name[]" value="0" />
<input type="checkbox"  name="chk_name[]"  value="1"/>

<?php 
function getAllChkboxValues($chk_name) 
    $found = array(); //create a new array 
    foreach($chk_name as $key => $val) 
        //echo "KEY::".$key."VALue::".$val."<br>";
        if($val == '1')  //replace '1' with the value you want to search
            $found[] = $key;
        
    
    foreach($found as $kev_f => $val_f) 
        unset($chk_name[$val_f-1]); //unset the index of un-necessary values in array
       
    final_arr = array(); //create the final array
    return $final_arr = array_values($chk_name); //sort the resulting array again

$chkox_arr = getAllChkboxValues($_POST['chk_name']); //Chkbox Values
echo"<pre>";
print_r($chkox_arr);
?>

【讨论】:

【参考方案5】:

这是我的解决方案:

<span>
<input class="chkBox" onchange="if($(this).is(':checked'))$(this).parent().find('.hidVal').prop('disabled',true);else$(this).parent().find('.hidVal').prop('disabled', false);" type="checkbox" checked name="session[]" value="checked_value_here" />
<input type="hidden" class="hidVal" name="session[]" value="un_checked_value_here" />
</span>
<span>
<input class="chkBox" onchange="if($(this).is(':checked'))$(this).parent().find('.hidVal').prop('disabled',true);else$(this).parent().find('.hidVal').prop('disabled', false);" type="checkbox" checked name="session[]" value="checked_value_here" />
<input type="hidden" class="hidVal" name="session[]" value="un_checked_value_here" />
</span>

【讨论】:

以上是关于如何将一组选中/未选中的复选框值传递给 PHP 电子邮件生成器?的主要内容,如果未能解决你的问题,请参考以下文章

未选中的复选框返回空值

如何使用 PHP 将复选框的值传递给 mySQL 数据库?

PHP jquery设置复选框值,如果选中或未选中并发布

如何在android中使用api将多个选中的复选框值传递给服务器?

如何将选中的复选框值传递给另一个页面?

使用 jQuery 查找未选中的复选框并将名称传递给 C# 代码