【问题标题】:PHP Form with While Loop Only Sending Last $_POST Checkbox带有 While 循环的 PHP 表单仅发送最后一个 $_POST 复选框
【发布时间】:2012-08-11 06:08:54
【问题描述】:

我有一个 PHP 表单,它从数据库中提取数据,按行打印出来,然后允许用户检查他们需要的项目。保存时,只有最后一个选项被发送到 $_POST。这是我的代码:

global $dbc; 

$afQuery = "SELECT fid, facility_name, city, state, country, phone from facilities 
            WHERE uid = '123'
            AND fid != '456'
            GROUP BY fid;";
        $afResult = $dbc->query($afQuery,__FILE__,__LINE__);
        $i = 0;
        while ($affiliated = $dbc->fetch($afResult)) {      
            ++$i;
            echo '<div class="action" style="float:left;">';
                echo '<input type="checkbox" name="affiliated[afid]" id="afid" value="'.$affiliated->fid.'">';
            echo '</div>';
            echo '<div class="facility-name">';
                echo '<input type="hidden" id="facility-name '.$i.'" name="affiliated[facility_name]" value="'.$affiliated->facility_name.'" />';
                echo $affiliated->facility_name;
            echo '</div>';
            echo '<div class="facility-location">';
                echo '<input type="hidden" id="facility-location '.$i.'" name="affiliated[facility_location]" value="'.$affiliates->city. ', ' . $affiliated->state . ' ' . $affiliated->country.'" />';
                echo $affiliated->city. ', ' . $affiliated->state . ' ' . $affiliated->country;
            echo '</div>';
            echo '<div class="facility-phone">';
                echo '<input type="hidden" id="facility-phone '.$i.'" name="affiliated[facility_phone]" value="'.$affiliated->phone.'" />';
                echo $affiliated->phone;
            echo '</div>';
            echo '<div class="clear"></div>';
            echo '<input type="hidden" id="update" name="update" value="' . $affiliated->fid . '" />';
        }

$dbc-&gt;fetch 等价于mysql_fetch_assoc

我正在尝试将这些值保存到 $affiliated 数组,但它应该为每个选定的项目提供子数组,因此我可以将数据库中的每个值存储在单独的行中。我在哪里想念它?我在 while 循环中尝试了一个 foreach,但没有成功。

感谢您的帮助!

* 更新 *

我已按照@Pinetree 的建议添加了$i,如下所示:

&lt;input type="checkbox" name="affiliated[afid]['.$i.']" id="afid" value="'.$affiliated-&gt;fid.'"&gt;

但是,现在我收到以下输出:

Array
(
    [afid] => Array
        (
            [1] => 5289
            [2] => 5290
            [3] => 5291
            [4] => 5292
        )

    [facility_name] => Array
        (
            [1] => Test Company
            [2] => Test Company 2
            [3] => Test Company 3
            [4] => Test Company 4
        )

    [facility_location] => Array
        (
            [1] => Address, State US
            [2] => Address, State US
            [3] => Address, State US
            [4] => Address, State US
        )

    [facility_phone] => Array
        (
            [1] => 555-555-5555
            [2] => 555-555-5555
            [3] => 555-555-5555
            [4] => 555-555-555
        )

)

我需要它看起来像这样,这样我就可以将每个完整的行插入到数据库中的一个表中:

Array
    (
        [0] => Array
            (
                [afid] => 5289
                [facility_name] => Test Company
                [facility_location] => Address, ST USA
                [facility_phone] => 555-555-5555
            )

    [1] => Array
        (
            [afid] => 5290
            [facility_name] => Test Company 1
            [facility_location] => Address, ST USA
            [facility_phone] => 555-555-5555
        )
)

建议?

【问题讨论】:

  • 喂,我建议你在回显大块 HTML 时考虑 heredoc 语法:php.net/manual/en/…
  • 有趣 - 感谢您的链接!
  • 我认为您应该接受 Pinetree 的回答并提出一个关于如何创建数组的单独问题 - 他清楚地解决了您最初的问题。

标签: php mysql forms for-loop while-loop


【解决方案1】:

如果我理解正确,您将回显多行输入。 如果是这种情况,您对每一行的输入使用相同的名称。 当帖子发生时,它只会取最后一个值。 您可以为每个输入名称添加另一个“[]”:

'<input name="affiliated[afid][]"/>'

甚至将 $i 放入其中:

'<input name="affiliated[afid]['.$i.']"/>'

在你的帖子中:

affiliated
    afid
        1: val
        2: val
        3: val
        ...
    facility_name
        1: val
        2: val
        3: val
        ...
    ...

整数对应于原始形式的行。所以 afid[1] 和 facility_name[1] 来自表格(和表格)中的同一行

编辑: 要将数组恢复为它们在表单中的格式:

$affiliated = array();
foreach($_POST['affiliated']['afid'] as $k => $v) {
    $affiliated[] = array(
        'afid' => $v,
        'facility_name' => $_POST['affiliated']['facility_name'][$k] // same key here
         // other fields
    );
}

重要编辑

由于您有复选框,请务必在输入名称中显式设置索引:

'<input name="affiliated[afid]['.$i.']"/>'

如果未选中复选框,则不会发布复选框,并且文本字段和类似字段会发布,因此您可能会遇到一种情况,例如,第二个 POSTED 复选框(如果从 0 开始,则索引 1)将映射到第二行$_POST,但复选框实际上位于表单本身的第三或第四行,并且之前的复选框没有发布

【讨论】:

  • 我认为这可行。 $_POST 是否仍然只获得最后一个值?
  • $_POST 确实获得了所有值。但是,现在我必须弄清楚如何将这些数据放入正确的数组中。
  • 我通常做的是选择一个值(如 afid)并使用键和值进行 foreach,然后您可以使用相同的键获取其他值。我添加了一个编辑来显示代码。
  • 谢谢@Pinetree!如果可行,我会尝试并接受您的回答。
  • 好的,我不知道如何让它工作。无论我将代码放在 while 内部还是外部,我都会收到一个无效的 foreach 错误。我最初使用 foreach 循环来获取这些值,并且必须切换到 while 才能打印出行。我没有成功将两者结合起来。
【解决方案2】:

$affiliated 不是一个数组,它是一个对象,并且您每次都在循环中(重新)设置它:

while ($affiliated = $dbc->fetch($afResult)){...}

另外,input 和一般的 DOM 元素 ID 不能包含您正在生成的空格:

echo '<input type="hidden" id="facility-name '.$i.'"

【讨论】:

  • 感谢您提供此信息,但遗憾的是它无助于解决问题。
猜你喜欢
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
相关资源
最近更新 更多