【问题标题】:Simple Perl and CGI::Ajax form validation简单的 Perl 和 CGI​​::Ajax 表单验证
【发布时间】:2013-03-25 01:30:38
【问题描述】:

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

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

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

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

有什么想法吗? 提前致谢。

#!/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;
    }
}

【问题讨论】:

    标签: ajax perl validation cgi


    【解决方案1】:

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

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

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

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

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

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

    还有:

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

    【讨论】:

    • 您好 Dan,感谢您的详细回复。我使用了浏览器的致命错误,但是我再次遇到了内部服务器错误。无论如何,令我困惑的是对该脚本的初始调用,$username 和 $password 没有定义并且应该是'',它们甚至没有传递给 form() 函数,但它们是这些奇怪的值。关于表单函数的参数,您可能是对的。我还将研究您提到的这些 Web 框架。好像这样开发CGI真的没什么意义。
    • @Sla,我想了更多,并用我认为正在发生的事情更新了答案。您得到奇怪值的原因是因为build_html 在调用您的函数时提供了参数。
    • 是的,我怀疑这里就是这种情况。我仍然不确定我是否理解为什么最初被称为 $ajx->build_html( $cgi, \&form);没有任何参数, $username 和 $password 假定这些奇怪的值。关于 Catalyst 的另一件事确实引起了我的注意,您是否仍然可以像使用 CGI::Ajax 一样轻松地集成 AJAX,这可能是一个愚蠢的问题,但我会得到关于 Catalyst 的书。再次感谢。
    • @Sla, &amp;form 不被称为“没有任何参数”。使用build_html 决定在调用它时使用的任何参数调用它。至于 Catalyst,是的,有 Ajax 支持(虽然我个人没有使用过)。
    猜你喜欢
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2011-12-25
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    相关资源
    最近更新 更多