对CGI :: AJAX严格

I have set of code for updating a password in the table, here I'm using CGI::AJAX module to update the password and get the popup screen on corresponding execution.When using that code with my application it is executing properly but I didn't get the output(means Perl subroutine is not called when JavaScript function to get use.password is not updated into table). I don't get any error either.

#!/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>&nbsp User Name</b>&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<INPUT TYPE="text" NAME="user" id = "user" size = "15" maxlength = "15" tabindex = "1"/></p>
<p>&nbsp Password:</b>&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<INPUT TYPE=PASSWORD NAME="newpassword" id = "newpassword" size = "15" maxlength = "15" tabindex = "1"/></p>
<p>&nbsp Re-Password:</b>&nbsp&nbsp&nbsp<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,"
";
                                        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>";

                        }

                }
my $create_newuser;
my $ajax = new CGI::Ajax('fetch_javaScript' => $create_newuser);
...;
$create_newuser =sub { ... };

At the moment when you create a new CGI::Ajax object, the $create_newuser variable is still undef. Only much later do you assign a coderef to it.

You can either assign the $create_newuser before you create the CGI::Ajax:

my $create_newuser =sub { ... };
my $ajax = new CGI::Ajax('fetch_javaScript' => $create_newuser);
...;

Or you use a normal, named subroutine and pass a coderef.

my $ajax = new CGI::Ajax('fetch_javaScript' => \&create_newuser);
...;
sub create_newuser { ... }

Aside from this main error, your script has many more problems.

You should use strict instead of the -w option.

For debugging purposes only, use CGI::Carp 'fatalsToBrowser' and sometimes even with warningsToBrowser can be extremely helpful. Otherwise, keeping a close eye on the error logs is a must.

my $p = new CGI qw(header start_html end_html h1 script link) doesn't make any sense. my $p = CGI->new should be sufficient.

use Class::Accessor seems a bit random here.

The HTML in Show_html is careless. First, your heredocs allows variable interpolation and escape codes – it has the semantics of a double quoted string. Most of the time, you don't want that. Start a heredoc like <<'END_OF_HTML' to avoid interpolation etc.
Secondly, look at that tag soup you are producing! Here are some snippets that astonish me:

  • bgcolor="#D2B9D3", align="middle" – because CSS hasn't been invented yet.
  • <center> – because CSS hasn't been invented yet, and this element isn't deprecated at all.
  • <table><tr><td><div ... </div></td></tr></table> – because there is nothing wrong with a table containing a single cell. (For what? This isn't even for layout reasons!) This table cell contains a single div
  • … which contains another center. Seriously, what is so great about unneccessary DOM elements that CSS isn't even an option.
  • style="width:400px;height:250px;border:3px solid black;" – because responsive design hasn't been invented yet.
  • <p> ... </b> – Oh, what delicious tag soup!
  • &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp – this isn't a typewriter, you know. Use CSS and proper markup for your layout. There is a difference between text containing whitespace, and empty areas in your layout.
  • tabindex = "1"tabindex = "1"tabindex = "1" – I don't think you know what tabindex does.
  • <A HREF = login.pl> – LOWERCASING OR QUOTING YOUR ATTRIBUTES IS FOR THE WEAK!!1
  • onclick="fetch_javaScript(['user','newpassword','repassword']);" – have you read the CGI::Ajax docs? This is not how it works: You need to define another argument with the ID of the element where the answer HTML is displayed.

In your create_newuser, you have an SQL injection vulnerability. Use placeholders to solve that. Instead of $sth->do("INSERT INTO ... VALUES('$foo')") use $sth->do('INSERT INTO ... VALUES(?)', $foo).

print ... – your Ajax handler shouldn't print output, instead it should return a HTML string, which then gets hooked into the DOM at the place your JS function specified. You want something like

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

and in your JS:

fetch_javaScript(['user','newpassword','repassword'], ['answer-element'], 'GET');

where your HTML document somewhere has a <div id="answer-element" />.