【问题标题】:How can I iterate through all checked values of a checkbox group in a Perl CGI script?如何遍历 Perl CGI 脚本中复选框组的所有选中值?
【发布时间】:2012-10-23 16:06:30
【问题描述】:

我有一个在 Windows 机器上运行的 xampp 测试系统设置。

我有一个小型命令行应用程序,我想使用 Perl CGI 脚本。

我有一个使用 Perl 创建的表单。有许多复选框以及一个输入框,用户可以在其中键入消息。

这是我到目前为止的代码。无论如何,我都不是 perl 专家,所以有 这里可能有一些没有意义的东西,或者用于测试目的

#!"C:\xampp\perl\bin\perl.exe"

#print a standard 200 -level HTTP header
print "Content-Type:text/html\n\n";

print "<html><head><title>Broadcast Message</title></head>\n";
print "<body>\n";

#display form data
#&displayInfo();

print "</body></html>\n";

if ($ENV{REQUEST_METHOD} eq "GET") 
  {
    &formDisplay();
    exit;
  }
#Else process and display back to screen
else
  {
    #&switches();
    &parseform();
    &displayInfo();

    exit;
  }  

#This subroutine will display information without using the HTML document

sub formDisplay
  {
    print qq~

    <FORM METHOD="POST" ACTION="/cgi-bin/broadcast.cgi">
      <h3>Broadcast Message to Domain</h3>
      ***PLEASE NOTE*** This will broadcast a message to ALL machines in the Domain</br></br>
      <TABLE cellpadding=0 cellspacing=1 border=0>
      <TR>
        <TD>Select your target by switch:&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp   </br></TD>
        <TD></TD>
        <TD>Select your target by department:                       </br></TD>
      </TR>
      <TR>
        <TD><input type=CHECKBOX name=517 value="517">   - 517      </br></TD>

        <TD></TD>
        <TD><input type=CHECKBOX name=ACC value="ACC">   - ACC      </br></TD>
      </TR>
      <TR>
        <TD><input type=CHECKBOX name=testfiletxt value="testfiletxt"> - testefiletxt </br></TD>
      </TR>
      </TABLE>
      </br></br>
      Please type the message you wish to broadcast to the Domain: </br>
      <input name="message"></br>

      <input type=SUBMIT name=Send value="Send">
      <input type=RESET name=Reset value="Reset">
    </form>
    ~;
  }

#This subroutine will display information received from a form 
sub displayInfo {
  print "<b>Your Message:</b> </br>  ",         $form{"message"}, "</br>";
  $system_message=$form{"message"};
  #system "sent.exe /u:testmachine \"$system_message\"" ;
  print qq~
  <form>
  <input type="button" value="Back" onclick="history.go(-1);return true;">
  </form>
  ~;
  # Working loop for form hash
  delete $form{'Send'};

  foreach(keys %form) {
  print "$form{$_} </br>";
  }
 ##############################
  $textme=$form{"testfiletxt"}; 
    open( FILE, "< $textme" ) or die "Can't open $filename : $!";

    while( <FILE> ) {
        chomp;
        print "sent.exe $_ ", $form{"message"} , "</BR>";
    }

    close FILE; 

}


sub parseform
  {
    #get data from environment variable
    read STDIN,$qstring,$ENV{"CONTENT_LENGTH"};
    #$qstring = $ENV{'QUERY_STRING'};

    #break data up on ampersands, and store in array
    @pairs = split(/&/, $qstring);

    #start a loop to process form data
    foreach (@pairs) {
    #split field name and value on "=", store in two scalar variables
    ($key, $value) = split(/=/);
    #translate '+' signs back to spaces
    $value =~ tr/+/ /;
    #translate special characters
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    #store data in hash
    $form{$key} = $value;
    }
  }

我遇到的问题是处理已选中的文本框。

我需要脚本做的是使用用户指定的参数(即复选框和输入框)运行命令行实用程序。

我认为这将如何工作如下:

  1. 我们已经预先构建了文本文件,其中将包含我们网络中的计算机Netbios names,每行一个计算机名称。这些文件将代表交换机,每个交换机文件将包含连接到它的计算机的 Netbios 名称。我们最终也会将其扩展到做小组。

  2. 用户将转到此广播页面并选择他们希望广播到的交换机。因此,任何连接到特定交换机的机器都将收到此广播消息。用户还将提供要广播的消息。

  3. 当用户点击“提交”时,有一些事情需要发生。

    • 需要打开代表所选交换机的文件,并且需要将用户输入的消息附加到列表中每个 Netbios 名称的末尾。示例:

    用户提供的netbiosName消息

    • 然后,一旦完成。命令行实用程序需要使用我们刚刚编辑的以下格式的文件运行:

       sent.exe /t:15 /f:$filename
      

    因此,如果用户选择了 3 个开关,则该命令应运行 3 次

         sent.exe /t:15 /f:swtich1
         sent.exe /t:15 /f:switch2
         sent.exe /t:15 /f:switch3
    

我应该指出,/f" 选项告诉sent.exe 命令使用需要以特定方式格式化的文件。

我在一次处理一个选项方面取得了一些成功。

但我不知道当用户选择多个复选框时会发生什么。

如何使用循环轻松处理选中的复选框?

我可以从&amp;parseform 子例程中提取它吗?还是有更简单的方法?

【问题讨论】:

  • 如果用户选择多个部门,您是问如何处理数据?
  • 首先,不要像那样手动解析表单数据。使用CGI.pmCGI::Simple。其次,将 HTML 与代码分开。第三,也是最重要的一点,您将允许任何可以查看该网页的人调用您机器上的另一个程序。首先阅读 CGI 安全常见问题解答:w3.org/Security/faq/wwwsf4.html
  • 是的 Andrey,我需要根据用户选择来处理数据。
  • 思南,我以前没听说过cgi.pm。谢谢你的建议!我将不得不尝试找到一些将 HTML 与代码分开的示例。当我第一次学习 perl 时,我被展示了如何将两者混合在一起。我将不得不改掉坏习惯!至于安全性,这是我一直关心的问题。我想让页面启动并运行。一旦我知道我可以让它工作,我将保护网站。它将仅在我们的本地网络上使用,并且需要身份验证和任何其他有助于确保安全的安全措施。感谢您的帮助!

标签: perl command-line checkbox cgi


【解决方案1】:

使用CGI.pm

my @checked = $cgi->param('department');

将为您提供名称为“部门”的所有选中复选框。为此,您需要清理 HTML:

<input type="checkbox" name="department" value="517" 
 id="department_517"><label for="department_517">517</label>

<input type="checkbox" name="department" value="ACC" 
 id="department_ACC"><label for="department_ACC">ACC</label>

<input type="checkbox" name="department" value="testfiletxt" 
 id="department_testfiletxt"><label 
 for="department_testfiletxt">testfile.txt</label>

【讨论】:

  • 谢谢,这成功了!我举了一个使用 param 选项的例子,它似乎运行良好。完成剧本还有很长的路要走,但我认为这是可行的。感谢您的帮助!
  • 看看HTML::TemplateCGI::Application。感谢您接受我的回答。
猜你喜欢
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多