【问题标题】:Collect $_POSTs from multiple checkbox rows从多个复选框行中收集 $_POSTs
【发布时间】:2012-02-09 22:15:25
【问题描述】:

我有一个包含多行复选框的表单,每个复选框都有一个特定的 id,这些复选框使用foreach 循环显示。

你如何从类似的东西中获取$_POST 信息?我认为它在某种程度上就像$_POST[][],就像一个子数组,但我不知道如何设置它:

foreach($stakholderArray as $currentEntry) {
    print "<tr class='$bgcolor'>";
    print "<td class='left'>$currentEntry[org]</td>";

    if($currentEntry['dataFound']) {  
        //if data was found for current stakeholder, display it
        print ($currentEntry['Partner']) ? '<td><input type ="checkbox" checked ="checked" /></td>' : '<td><input type ="checkbox"  /></td>';
        print ($currentEntry['Agreement']) ? '<td><input type ="checkbox" checked ="checked" /></td>' : '<td><input type ="checkbox"  /></td>';
        print ($currentEntry['Train']) ? '<td><input type ="checkbox" checked ="checked" /></td>'  : '<td><input type ="checkbox"  /></td>';
        print ($currentEntry['Meet'])  ? '<td><input type ="checkbox" checked ="checked" /></td>' : '<td><input type ="checkbox"  /></td>';
    }
    else {  //else...no stakeholder data, display empty columns
        print "<td><input type ='checkbox'/></td><td><input type ='checkbox'/></td><td><input type ='checkbox'/></td><td><input type ='checkbox'/></td><td><input type ='checkbox'/></td>";
        print "</tr>";
    }## Heading ##

【问题讨论】:

标签: php arrays foreach-loop-container


【解决方案1】:

这与我之前回答的一个问题有点相关:POST an array from an HTML form without javascript

  • 将它们封装在一个表格中
  • 给他们一个“数组”的名字
  • 提交时,它们最终会在发布期间以数组形式出现

相关项目应该是这样的:name="item[collection name][collection name][]" - 请注意与集合有关的第一个索引(以便于定位),以及该集合中的空索引表示,有一个数组(而不是单个值)。所以对于您的复选框:

<input type="checkbox" name="answers[set1][]" value="apple" />   //imagine checked
<input type="checkbox" name="answers[set1][]" value="orange" />  //imagine checked
<input type="checkbox" name="answers[set1][]" value="grape" />
<input type="checkbox" name="answers[set2][]" value="airplane" />   //imagine checked
<input type="checkbox" name="answers[set2][]" value="train" />  //imagine checked
<input type="checkbox" name="answers[set2][]" value="boat" />
<input type="checkbox" name="answers[solo]" value="boar" /> //single type value. note that there is no [] in the end

在请求数组中以这样的方式结束(比如 POST):

$_POST[] = array(
    'answers' => array(
        'set1' => array('apple','orange'),   //unchecked items won't be included
        'set2' => array('airplane','train'), //unchecked items won't be included
        'solo' => 'boar'
    )
);

<table>
    <?php foreach($stakeholderArray as $stakeholder): ?>
    <tr>

    <?php 

        //declare so these exist regardless of data
        $partner   = '';
        $agreement = '';
        $train     = '';
        $meet      = '';

        //if we have data, mark the boxes accordingly
        if($stakeholder['dataFound']){

            $checked = 'checked ="checked"';

            //mark as checked or blank
            $partner   = ($stakeholder['Partner'])   ? $checked: '';
            $agreement = ($stakeholder['Agreement']) ? $checked: '';
            $train     = ($stakeholder['Train'])     ? $checked: '';
            $meet      = ($stakeholder['Meet'])      ? $checked: '';

        }
    ?>

       <td><input value='partner' name="stake[<?= $stakeholder ?>][partner]" type ="checkbox" <?= $partner ?> /></td>
       <td><input value='agreement' name="stake[<?= $stakeholder ?>][agreement]" type ="checkbox" <?= $agreement ?> /></td>
       <td><input value='train' name="stake[<?= $stakeholder ?>][train]" type ="checkbox" <?= $train ?> /></td>
       <td><input value='meet' name="stake[<?= $stakeholder ?>][meet]" type ="checkbox" <?= $meet ?> /></td>

    </tr>
    <?php endforeach; ?>
</table>

他们最终应该是这样的:

$_POST[] = array(
    'stakeholder1' => array(
        'partner'=> 'partner',
        'agreement'=> 'agreement',
        'train'=> 'train',
        'meet'=> 'meet'
    ),
    'stakeholder2' => array(
        'partner'=> 'partner',
        'agreement'=> 'agreement',
        'train'=> 'train',
        'meet'=> 'meet'
    ),
);

【讨论】:

【解决方案2】:

给每个checkbox元素一个不同的name标签(你需要添加name="WhatEverYouwant"

您可以通过以下方式获得它:

$_POST['ID Of the Element']

例子:

'<td><input type ="checkbox" name="new" checked ="checked" /></td>' : '<td><input type ="checkbox"  /></td>';

并通过以下方式获取:

$_POST['new']

【讨论】:

  • $_POST捡到的不是id,而是name属性
【解决方案3】:

假设您已经在 &lt;form&gt; 中拥有它,您需要为每个输入提供一个 id。然后在生成的 PHP 脚本中,使用 $_POST['whatever_the_name_is'](您也可以使用 $_REQUEST$_GET,具体取决于您的表单操作)。

【讨论】:

    【解决方案4】:

    不是答案,而是 yeowch... 减少逻辑中的一些重复 HTML:

    print ($currentEntry['Partner'])     ? '<td><input type ="checkbox" checked ="checked" /></td>' : '<td><input type ="checkbox"  /></td>';
    

    应该是

    <td><input type ="checkbox"<?php ($currentEntry['Partner'] ? ' checked ="checked"' : '' ?> /></td>
    

    【讨论】:

      【解决方案5】:

      更改:

      <input type ="checkbox" ...
      

      收件人:

      <input type="checkbox" name="stakeholderarray[]" ...
      

      或者:

      <input type="checkbox" name="stakeholderarray[KEYNAME]" ...
      

      在 PHP 中的访问:

      foreach($_POST['stakeholderarray'] as $this_stakeholderarray){
       ...
      }
      

      或者:

      $_POST['stakeholderarray']['KEYNAME'];
      

      之所以有效,是因为添加到name 属性末尾的[KEYNAME] 在PHP 中被视为array 项,因此可以循环通过。你也可以用这种方式嵌套数组,所以如果你想在一个表单上拥有多个利益相关者,请执行以下操作:

      <input type="checkbox" name="stakeholderarray[0][0]" ... <!-- Holder 0, item 0 -->
      <input type="checkbox" name="stakeholderarray[0][1]" ... <!-- Holder 0, item 1 -->
      <input type="checkbox" name="stakeholderarray[1][0]" ... <!-- Holder 1, item 0 -->
      <input type="checkbox" name="stakeholderarray[1][1]" ... <!-- Holder 1, item 1 -->
      

      【讨论】:

      • 这里的问题是你不会知道$_POST[stakeholderarray][]数组中的哪些元素属于哪一行复选框。只有被检查的那些存储在数组中。
      • 稍微改变了答案——没想到他给每个人分配了一个特定的值,而不是一个项目列表。
      【解决方案6】:
      $i = 0;
      foreach($stakholderArray as $currentEntry) {
        print "<tr class='$bgcolor'>";
        print "<td class='left'>$currentEntry[org]</td>";
        if($currentEntry['dataFound']) {  //if data was found for current stakeholder, display it
          print '<td><input type ="checkbox" name="chkPartner['.$i.']" '.(($currentEntry['Partner'])?'checked ="checked"':'').' /></td>';
        //print the rest like this
        $i++;
      }
      

      然后您可以像这样从$_POST 访问它们

      if(isset($_POST[chkPartner][$yourIndex]))
      {}
      

      【讨论】:

        【解决方案7】:

        实际上id 不应该工作。正如约瑟夫所说,表单元素以其名称作为键发送。所以正确的标签应该是:

        &lt;input type="checkbox" name="some_name" ... /&gt;

        发送表单时,可以得到$_POST['some_name']这样的数据

        如果您愿意,可以将它们放入数组name="somearr[someotherarr[some_name]]]",然后内容将在$_POST['somearr']['someotherar']['some_name'] 中可用

        希望对您有所帮助。

        【讨论】:

        • somearr[someotherarr[some_name]]] 并没有完成你认为的事情。
        • 是的,我的立场是正确的。单级数组虽然 array[key].
        • 多级也可以。请改用somearr['someotherarr']['some_name'],这将达到您最初的预期。 :)
        猜你喜欢
        • 2021-11-10
        • 1970-01-01
        • 1970-01-01
        • 2021-11-22
        • 2014-10-07
        • 1970-01-01
        • 1970-01-01
        • 2012-12-22
        相关资源
        最近更新 更多