我试图用PERL / CGI创建一个表单,我想在同一个CGI文件中处理该表单中引入的数据

问题描述 投票:0回答:3

'我正在尝试用PERL / CGI创建一个表单,我想在同一个CGI文件中处理该表单中引入的数据。这就是我在HTML5端的代码所拥有的......'

<body>
   <form action="form.cgi" method="get">
</form>

<h1>Feedback Form</h1>
<p>Please fill out the entire feedback form.</p>
<table>
<tr>
<td><b>To (recipient's e-mail address):</b></td>
</tr>
<tr>
<td><input type = "text" name = "mailTo" size = "40"  /></td>
</tr>
<tr>
<td><b>From (your e-mail address):</b></td>
</tr>
<tr>
<td><input type = "text" name = "mailFrom" size = "40" /></td>
</tr>
<tr>
<td><b>Enter a subject:</b></td>
</tr>
<tr>
<td><input type = "text" name = "subjectLine" size = "40" /></td>
</tr>
<tr>
<td><b>Enter your message:</b></td>
</tr>
<tr>
<td><textarea name = "message" rows = "10" cols = "50"></textarea></td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td><input type = "submit" name = "sbutton" value = "Submit" />
<input type = "reset" value = "Reset" /></td>
</tr>
</table>

<br><br><br><br><br> 



</div>
</body></html>

PERL / CGI表格代码

#!/usr/bin/perl
use Modern:: Perl;
use Mail::Sendmail; 

my $mailFrom = email@email'; 

my $subjectLine = "Sample Subject:l 
my $message = "Sample Message!"; 
my %mail = ( To      => $mailTo, 
             From    => $mailFrom, 
             Subject => $subjectLine,
             Message => $message, 
             'Content-Type' => 'text/plain' 
           ); 

if ( sendmail %mail ) 
{
  print "Sucessfully sent mail to $mailTo. Check you box! \n";
}
else 
{
  print "Error sending mail: $Mail::Sendmail::error \n";
}

我花了几个小时试图弄清楚这段代码。请任何人帮助我。我为这两个不同的代码制作了两个不同的文件。我觉得我错过了一些东西,或者我错过了一些小东西。

谢谢 :)

html forms perl cgi
3个回答
0
投票

您的所有输入字段必须位于打开的<form>和结束</form>标记之间。

此外,表单方法应该是“post”,而不是“get”。

你有form.cgi的表单行动。这个文件在你的服务器上的哪个位置?在典型的设置中,它可能位于cgi-bin目录中,在这种情况下,您可能想要尝试action="/cgi-bin/form.cgi"

希望这些建议有所帮助


0
投票

您正在使用许多没有值的变量 - $mailTo$subjectLine$message。我想你已经习惯了PHP,那些像你这样的变量会自动填充。 Perl的情况并非如此。您需要自己提取表单字段数据。

当您编写CGI程序时,最简单的解决方案可能是使用CGI模块中的param()函数来执行此操作。

use CGI 'param';

my $subjectLine = param('subjectLine'); # etc...

此外,CGI程序需要在发送任何实际输出之前发送“内容类型”标头。在编写纯文本时,您应该使用text/plain。 CGI模块还具有header()功能,可以在这里为您提供帮助。

# Load both of the functions you're going to use
use CGI ('header', 'param');

# Run this before any other print statements
print header(-type => 'text/plain');

如果你要编写CGI程序,那么花点时间阅读documentation for the CGI module是个好主意。但我也建议阅读CGI::Alternatives,因为CGI不再是在Perl中编写Web程序的最佳方式。

此外,在您的HTML中,您的结束</form>标记应该在所有表单输入之后。


0
投票

使用您的HTML代码很容易有一个perl CGI表单调用,here's a small example。 (顺便说一句,所有表单字段都必须包含在<form>标记内,而不是你的方式。是的,表单方法是POST。)

这个CGI文件必须根据访问方式的不同而有所不同。首先,它需要打印出带有空表单字段的HTML。这是代码中的“$ html”变量。然后,当它被提交时,它需要接收表单参数,并对数据执行某些操作。要通过电子邮件发送,请调用mailForm子例程。我的服务器上没有sendmail,所以我只打印出示例中的表单数据。邮编如下。

CGI脚本需要区分被访问为网页和被称为表单操作之间的区别。为此,它会检查名为“check”的隐藏表单字段。如果定义了“check”,则表示表单已提交,并且有数据要收集和处理。如果未定义“check”,则只打印出空表单字段。

可能有更优雅的方法来做到这一点,但我只是想展示一个处理自己提交的数据的CGI文件,以防任何人对未来感兴趣。确保该文件与表单的操作具有相同的名称。这是我的示例代码form.cgi

#!/usr/bin/perl        
use CGI::Carp qw(fatalsToBrowser set_message warningsToBrowser);
use CGI qw(:standard);
use strict;                     
use warnings;   

print header(); 

my $cgi = CGI->new();

my $check;
$check = $cgi->param('check') if defined $cgi->param('check');

my $newhtml = '';

if ($check eq "yes") { #collect form data and build email subroutine
my $fromemail = $cgi->param('mailFrom');
my $toemail = $cgi->param('mailTo');
my $subject = $cgi->param('subjectLine');
my $message = $cgi->param('messageBody');

$newhtml = qq{
<html>
<body>
<b>Email sent!</b>
<br>
The from email is from $fromemail<br>
The to email is to $toemail<br>
The subject is $subject<br>
The message is $message<br>
</body>
</html>
 };

sub mailForm {
open(MAIL, "|/usr/sbin/sendmail -t");

print MAIL "To: $toemail\n";
print MAIL "From: $fromemail\n";
print MAIL "Subject: $subject\n\n";

print MAIL $message;

close(MAIL);
}


} #end of if check

my $html = qq{
<html>
<body>
   <form action="form.cgi" method="POST">

<h1>Feedback Form</h1>
<p>Please fill out the entire feedback form.</p>
<table>
<tr>
<td><b>To (recipient's e-mail address):</b></td>
</tr>
<tr>
<td><input type = "text" name = "mailTo" size = "40" maxlength = "50"  /></td>
</tr>
<tr>
<td><b>From (your e-mail address):</b></td>
</tr>
<tr>
<td><input type = "text" name = "mailFrom" size = "40" maxlength = "50" /></td>
</tr>
<tr>
<td><b>Enter a subject:</b></td>
</tr>
<tr>
<td><input type = "text" name = "subjectLine" size = "40" maxlength = "50"></td>
</tr>
<tr>
<td><b>Enter your message:</b></td>
</tr>
<tr>
<td><textarea name = "messageBody" rows = "10" cols = "50" maxlength = "300"></textarea></td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td><input type = "submit" name = "sbutton" value = "Submit" />
<input type = "reset" value = "Reset" />
<input type = "hidden" name = "check" value = "yes">
</td>
</tr>
</table>

</form>

<br>

</body></html>
};

#this prints the regular page if no form is submitted
if (!defined $check) {
print $html;
}

#this mails the form data and prints a confirmation page
else {
print $newhtml; 
mailForm();
}

exit 0;
© www.soinside.com 2019 - 2024. All rights reserved.