我有一组用于更新表中密码的代码,这里我使用CGI :: AJAX模块来更新密码并获得相应执行的弹出屏幕。当我的应用程序使用该代码时,它正在正确执行但是我没有得到输出(意味着当JavaScript函数得到use.password没有更新到表中时,不会调用Perl子例程)。我也没有收到任何错误。
#!/usr/bin/perl -w
use strict;
use CGI;
use DBI;
use Data::Dumper;
my $p = new CGI qw(header start_html end_html h1 script link);
use Class::Accessor;
use CGI::Ajax;
my $create_newuser;
my $ajax = new CGI::Ajax('fetch_javaScript' => $create_newuser);
print $ajax->build_html($p,\&Show_html,{-charset=>'UTF-8', -expires=>'-1d'});
sub Show_html
{
my $html = <<EOHTML;
<html>
<body bgcolor="#D2B9D3">
<IMG src="karvy.jpg" ALT="image">
<form name='myForm'>
<center><table><tr><td>
<div style="width:400px;height:250px;border:3px solid black;">
<center><h4>Create New Password's</h4>
<p>  User Name</b>       <INPUT TYPE="text" NAME="user" id = "user" size = "15" maxlength = "15" tabindex = "1"/></p>
<p>  Password:</b>         <INPUT TYPE=PASSWORD NAME="newpassword" id = "newpassword" size = "15" maxlength = "15" tabindex = "1"/></p>
<p>  Re-Password:</b>   <INPUT TYPE=PASSWORD NAME="repassword" id = "repassword" size = "15" maxlength = "15" tabindex = "1"/></p>
<input type="submit" id="val" value="Submit" align="middle" method="GET" onclick="fetch_javaScript(['user','newpassword','repassword']);"/><INPUT TYPE="reset" name = "Reset" value = "Reset"/>
<p>Main Menu <A HREF = login.pl>click here</A>
</center>
</div>
</td></tr></table></center>
</form>
</body>
</html>
EOHTML
return $html;
}
$create_newuser =sub
{
my @input = $p->params('args');
my $user=$input[0];
my $password=$input[1];
my $repassword=$input[2];
my $DSN = q/dbi:ODBC:SQLSERVER/;
my $uid = q/123/;
my $pwd = q/123/;
my $DRIVER = "Freetds";
my $dbh = DBI->connect($DSN,$uid,$pwd) or die "Coudn't Connect SQL";
if ($user ne '')
{
if($password eq $repassword)
{
my $sth=$dbh->do("insert into rpt_account_information (user_id,username,password,user_status,is_admin) values(2,'".$user."','".$password."',1,1)");
my $value=$sth;
print $value,"\n";
if($value == 1)
{
print 'Your pass has benn changed.<a href="login.pl">Return</a> to the main page';
}
}
else
{
print "<script>alert('Password and Re-Password does not match')</script>";
}
}
else
{
print "<script>alert('Please Enter the User Name')</script>";
}
}
答案 0 :(得分:0)
my $create_newuser;
my $ajax = new CGI::Ajax('fetch_javaScript' => $create_newuser);
...;
$create_newuser =sub { ... };
在您创建新的CGI::Ajax
对象时,$create_newuser
变量仍为undef
。只有很久以后你才会为它分配一个coderef。
您可以在创建$create_newuser
之前指定CGI::Ajax
:
my $create_newuser =sub { ... };
my $ajax = new CGI::Ajax('fetch_javaScript' => $create_newuser);
...;
或者您使用普通的命名子例程并传递coderef。
my $ajax = new CGI::Ajax('fetch_javaScript' => \&create_newuser);
...;
sub create_newuser { ... }
除了这个主要错误之外,你的脚本还有很多问题。
您应该use strict
而不是-w
选项。
仅出于调试目的,use CGI::Carp 'fatalsToBrowser'
,有时甚至是warningsToBrowser
可能非常有用。否则,必须密切关注错误日志。
my $p = new CGI qw(header start_html end_html h1 script link)
没有任何意义。 my $p = CGI->new
就足够了。
use Class::Accessor
似乎有点随机。
Show_html
中的HTML粗心。首先,你的heredocs允许变量插值和转义码 - 它具有双引号字符串的语义。大多数时候,你不希望这样。启动像<<'END_OF_HTML'
这样的heredoc以避免插值等
其次,看看你正在制作的标签汤!以下是一些令我吃惊的片段:
bgcolor="#D2B9D3"
,align="middle"
- 因为尚未发明CSS。<center>
- 因为尚未发明CSS,而且此元素根本不是deprecated。<table><tr><td><div ... </div></td></tr></table>
- 因为包含单个单元格的表格没有任何问题。 (对于什么?这甚至不是出于布局原因!)此表格单元格包含单个div
... center
。说真的,不必要的DOM元素有什么好处,CSS甚至都不是一个选项。style="width:400px;height:250px;border:3px solid black;"
- 因为尚未发明响应式设计。<p> ... </b>
- 哦,什么美味的标签汤!       
- 这不是打字机,你知道。为您的布局使用CSS和适当的标记。包含空格的文本与布局中的空白区域之间存在差异。tabindex = "1"
... tabindex = "1"
... tabindex = "1"
- 我认为你不知道what tabindex
does。<A HREF = login.pl>
- 放弃或引用您的属性是为了弱!! 1 onclick="fetch_javaScript(['user','newpassword','repassword']);"
- 你读过CGI::Ajax docs了吗?这不是它的工作原理:您需要使用显示答案HTML的元素的ID来定义另一个参数。在create_newuser
中,您有一个SQL注入漏洞。使用占位符来解决这个问题。而不是$sth->do("INSERT INTO ... VALUES('$foo')")
使用$sth->do('INSERT INTO ... VALUES(?)', $foo)
。
print ...
- 您的Ajax处理程序不应该打印输出,而应该return
一个HTML字符串,然后在JS函数指定的位置将其挂钩到DOM中。你想要像
use HTML::Entities;
sub create_newuser {
my ($user, $password, $repassword) = $p->params('args');
my ($e_user, $e_password) = map { encode_entities($_) } $user, $password;
# DON'T DO THIS, it is a joke
return "Hello <em>$e_user</em>, your password <code>$e_password</code> has been successfully transmitted in cleartext!";
}
并在你的JS中:
fetch_javaScript(['user','newpassword','repassword'], ['answer-element'], 'GET');
您的HTML文档在哪里有<div id="answer-element" />
。