0

我正在尝试做一个真正简单的设置。

1.使用 CGI::Ajax 对每个字段进行检查。2.验证所有字段都已用简单的perl CGI填写

问题是,当单独测试时,两者都可以工作,但是当结合起来时,如下面的代码所示,我有两个问题:

1.在用户名和密码字段中,我看到 CGI=HASH(0x228ed48) 等 2.当我按下提交按钮并出现错误(字段为空)时,它会打印内部服务器错误,我相信这是由于$ajx->build_html($cgi, \&form($error, $username, $password)); 并以这种方式调用表单函数。

有任何想法吗?提前致谢。

#!/usr/bin/perl -w



use CGI;
use CGI::Session qw/ -ip-match/;
use CGI::Ajax;

$cgi = new CGI;
#$session = new CGI::Session(undef, $cgi, {Directory=> '/tmp'});
my $ajx = new CGI::Ajax( 'checkuser' => \&checkuser );

#print $ajx->build_html( $cgi, \&form);




if($cgi->param("submit")) {

process(); } else { print $ajx->build_html( $cgi, \&form); }


sub checkuser 
{
my $input = shift;
my $out = $input . " is not taken";

return $out;
}


sub form {

my $error = shift;
my $username = shift;
my $password = shift;



my $html = <<HTML;
<html>
<BODY>
<form id='log' action='session.cgi' method='post' accept-charset='UTF-8'>
<input type="hidden" name="submit" value="Submit">
<fieldset>
<legend>Login</legend>
<font color="red">$error</font>
<label for='username' >UserName*:</label>
<input type='text' name='user' id='user' value="$username" 
maxlength="50" onchange="checkuser( ['user'], ['resultdiv'] );">
<br><br>
<div id="resultdiv"></div>
<label for='password' >Password*:</label>
<input type='password' name='pd' id='pd' value="$password" maxlength="50" />
<input type='submit' name='Submit' value='Submit' />
</fieldset>
</form>
</body></html>
HTML

return $html;


}

sub process 
{

   if(validate_form()) {
print $cgi->header;
   print <<HTML;
<body>Validated<br></body>

HTML
                        }

}

sub validate_form 
{

my $username = $cgi->param("user");
my $password = $cgi->param("pd");

my $error = "";

 $error .= "Please enter your username<br/>" if ( !$username );
    $error .= "Please specify your password<br/>" if ( !$password );

    if ( $error )
    {
 $ajx->build_html( $cgi, \&form($error, $username, $password));
        return 0;
    }
    else
    {

        return 1;
    }
}
4

1 回答 1

3

为了发展,use CGI::Carp qw/fatalsToBrowser/;. 这将允许您查看代码产生的实际错误,而不是“内部服务器错误”。

更新:此外,您的代码失败是因为您误解了回调函数的工作原理。回调函数不是你调用的;它由您传递给它的代码调用——在本例中为模块。所以你不能提供参数,模块可以。这不起作用:

$ajx->build_html( $cgi, \&form($error, $username, $password));

build_html想要在内部调用你传入的函数,并使用它自己的参数。

在这里你不允许发生。相反,您在调用form()之前调用build_html(),然后传入对结果的标量引用。这稍后会失败,因为build_html尝试将该标量引用用作子例程引用。

解决方案:您只需要使用\&form. 您将需要另一种方式来填写这些字段。

还:

  • 表单验证是一项非常常见的任务。成熟的 Perl 模块可用并广泛用于此目的(例如HTML::FormFuData::Formvalidator)。还有一些相关模块似乎添加了 Javascript 验证 ( HTML::FormFu::ExtJS, JavaScript::DataFormValidator)。在创建自己的之前,可能值得检查一下。
  • 大多数现代 Perl Web 开发都是使用某种 Web 框架完成的。可用的框架非常强大,值得用于除了最简单的项目之外的所有项目。如果你的目标是学习,我建议尽早从框架开始,因为使用框架进行开发与传统的 CGI 开发有很大不同,并且存在学习曲线。我对Catalyst非常满意,还有其他选择,例如MojoliciousDancer
于 2013-04-03T13:09:02.683 回答