【问题标题】:Handle POST data sent as array处理以数组形式发送的 POST 数据
【发布时间】:2019-02-08 14:14:47
【问题描述】:

我有一个 html 表单,它发送一个隐藏字段和一个同名的单选按钮。

这允许人们在不从列表中选择的情况下提交表单(但会记录一个零答案)。

当用户选择单选按钮时,表单会同时发布隐藏值和选定值。

我想编写一个 perl 函数来将 POST 数据转换为哈希。以下适用于标准文本框等。

#!/usr/bin/perl
use CGI qw(:standard);
sub GetForm{
    %form;
    foreach my $p (param()) {
         $form{$p} = param($p); 
    }
    return %form;
}   

但是,当面对两个同名的表单输入时,它只返回第一个(即隐藏的)

我可以看到输入作为数组包含在 POST 标头中,但我不知道如何处理它们。

我正在使用遗留代码,所以很遗憾我无法更改表单!

有没有办法做到这一点?

【问题讨论】:

    标签: perl cgi


    【解决方案1】:

    我有一个 html 表单,它发送一个隐藏字段和一个单选按钮 同名。

    这允许人们在不从列表中选择的情况下提交表单 (但记录为零答案)。

    这是一种奇怪的方法。将隐藏的输入排除在外并将缺少数据视为零答案会更容易。


    但是,如果您想坚持自己的方法,请阅读the CGI module 的文档。

    具体来说,documentation for param:

    当调用 param() 如果参数是多值的(例如,来自滚动列表中的多个选择),您可以要求接收一个数组。否则该方法将返回第一个值。

    因此:

    $form{$p} = [ param($p) ]; 
    

    但是,您似乎确实在重新发明轮子。有一个built-in method to get a hash of all paramaters

    $form = $CGI->new->Vars
    

    也就是说,文档还说:

    CGI.pm 不再被视为开发 Web 应用程序(包括快速原型设计和小型 Web 脚本)的良好实践。目前有更好、更清洁、更快、更简单、更安全、更可扩展、更可扩展、更现代的替代方案可用。这些将记录在CGI::Alternatives

    所以无论如何你都应该远离这个。

    【讨论】:

    • 太棒了!那行得通。我从 2004 年开始拆解某人的代码,他似乎在 1950 年代接受过培训。这很hacky,但我选择了: if([param($p)]->[1]){ $dataToReturn{$p} = [param($p)]->[1]; }else{ $dataToReturn{$p} = [param($p)]->[0]; }
    • 请注意,在列表上下文中使用param 已被弃用,您应该为此使用multi_param,以明确您需要一个列表。这试图避免在列表上下文中意外使用它的情况。
    【解决方案2】:

    替换

    $form{$p} = param($p);                             # Value of first field named $p
    

    $form{$p} = ( multi_param($p) )[-1];               # Value of last field named $p
    

    $form{$p} = ( grep length, multi_param($p) )[-1];  # Value of last field named $p
                                                       # that has a non-blank value
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 2022-08-06
      • 1970-01-01
      相关资源
      最近更新 更多