我正在尝试做一个真正简单的设置。
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;
}
}
答案 0 :(得分:3)
对于开发,use CGI::Carp qw/fatalsToBrowser/;
。这将允许您查看代码产生的实际错误,而不是“内部服务器错误”。
更新:此外,您的代码失败了,因为您误解了回调函数的工作原理。您没有调用回调函数;它是由您传递给它的代码调用的 - 在本例中是模块。所以你不能提供参数,模块呢。这不起作用:
$ajx->build_html( $cgi, \&form($error, $username, $password));
build_html
想要使用自己的参数调用内部传递的函数。
在这里你不允许发生。相反,在调用form()
之前调用build_html()
,然后传入标量引用结果。稍后失败,因为build_html
尝试将该标量引用用作子例程引用。
解决方案:您只需使用\&form
即可。您将需要另一种方式填写字段。
此外:
HTML::FormFu
和Data::Formvalidator
)。还有一些相关模块似乎添加了Javascript验证(HTML::FormFu::ExtJS
,JavaScript::DataFormValidator
)。在创建自己的文件之前,可能需要检查这些内容。