【问题标题】:perl cgi cannot print elements from php checkbox arrayperl cgi 无法从 php 复选框数组中打印元素
【发布时间】:2012-07-24 11:51:39
【问题描述】:

我有一个 HTML 表单,它将复选框值作为数组发送到 Perl CGI 脚本。但是,由于该站点主要使用 PHP 重建,因此复选框数组的处理方式有所不同。我有一个返回表单的 PHP 函数。它看起来像这样:

<td>Profiles: </td>
<td><input type=\"checkbox\" value=\"oneconnect\" name=\"v1-profile[]\">OneConnect <br />
<input type=\"checkbox\" value=\"http\" name=\"v1-profile[]\">HTTP <br />
<input type=\"checkbox\" value=\"xforwardedfor\" name=\"v1-profile[]\">Xforwarded-for</td>
</tr>

然后我将其发送到 Perl CGI 脚本

use CGI qw(:standard);
my $q = new CGI;
my @profiles1 = $q->param("v1-profile");

当我尝试打印数组的元素时,我只看到“数组”这个词作为输出。

foreach my $r (@profiles1) {
print "$r\n";
}

我也尝试了一些不起作用的方法。

foreach my $r (@profiles1) {
foreach my $v (@$r) {
print "$v\n";
}
}

如何访问“@profiles1”数组的元素?感谢您的帮助!

【问题讨论】:

  • 您是否看到类似ARRAY(0x27967ac) 的内容?这与 Array 不同,这意味着您有一个只需要取消引用的数组引用。

标签: php perl cgi


【解决方案1】:

变量名后面的[] 是一个PHP 主义——它不是标准的,并且没有被Perl 的CGI 模块(或PHP 以外的任何东西,真的)特别对待。如果可以,请将其从表单中删除。如果没有,您应该能够通过在名称中包含括号来从 Perl 获取参数:

my @profiles = $q->param("v1-profile[]");

【讨论】:

  • 感谢您的回复。当我从 PHP 表单中删除“[]”时,CGI 脚本会起作用。但是,如果您选择多个复选框,我只会看到 1 个元素发送到 CGI 脚本。我需要多个复选框。我还尝试按照您的建议将“[]”添加到参数名称中,但这不起作用。 (当时我什至没有看到“Array”这个词的输出。再次感谢您的建议。
  • @dars33 — 这和您的原始代码似乎都在列表上下文中获取结果,因此它应该为您提供所有选中复选框的值。
【解决方案2】:

不确定您的问题是什么。这对我来说似乎工作得很好。这是我搭建的小型试验台。

test.html:

<html>
  <head>
    <title>Test</title>
  </head>
  <body>
    <h1>Test</h1>
    <form action="/cgi-bin/form">
      <table>
        <tr>
          <td>Profiles: </td>
          <td><input type="checkbox" value="oneconnect" name="v1-profile[]">OneConnect <br />
          <input type="checkbox" value="http" name="v1-profile[]">HTTP <br />
          <input type="checkbox" value="xforwardedfor" name="v1-profile[]">Xforwarded-for<br />
          <input type="submit"></td>
        </tr>
      </table>
    </form>
  </body>
</html>

cgi-bin/表单:

#!/usr/bin/perl

use strict;
use warnings;
use CGI;

my $q = CGI->new;

print $q->header(-type => 'text/plain');

my @profiles = $q->param('v1-profile[]');

foreach (@profiles) {
  print "$_\n";
}

而且我看到的正是我所期望的。我选中的每个复选框都会显示在输出中。

要检查的一件事。提交表单后,您的 URL 是什么样的?我的看起来像这样(选中了两个复选框)。

http://localhost/cgi-bin/form?v1-profile%5B%5D=oneconnect&v1-profile%5B%5D=xforwardedfor

请注意,输入名称中的方括号已经过 URL 编码。这就是应该发生的事情。

所以问题是,这与您的设置有何不同?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 2013-12-29
    • 2013-05-31
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    相关资源
    最近更新 更多