简单的Perl和CGI :: Ajax表单验证

时间:2013-04-03 11:42:16

标签: ajax perl validation cgi

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

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;
    }
}

1 个答案:

答案 0 :(得分: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::ExtJSJavaScript::DataFormValidator)。在创建自己的文件之前,可能需要检查这些内容。
  • 大多数现代Perl Web开发都是使用某种Web框架完成的。可用的框架非常强大,除了最简单的项目之外,所有框架都值得使用。如果您的目标是学习,我建议尽早从框架开始,因为使用框架的开发与传统的CGI开发完全不同,并且存在学习曲线。我对Catalyst感到非常满意,还有其他选项,例如MojoliciousDancer