0

私は本当に簡単なセットアップをしようとしています。

1.CGI::Ajax を使用して各フィールドをチェックします。2.すべてのフィールドが単純な perl CGI で入力されていることを確認します。

問題は、個別にテストすると両方が機能することですが、以下のコードに見られるように組み合わせると、2 つの問題があります。

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

1 に答える 1

3

開発のために、use CGI::Carp qw/fatalsToBrowser/;. これにより、「内部サーバー エラー」ではなく、コードが生成している実際のエラーを確認できます。

更新:また、コールバック関数のしくみを誤解しているため、コードが失敗しています。コールバック関数はユーザーによって呼び出されません。これは、渡したコード (この場合はモジュール) によって呼び出されます。したがって、パラメーターを提供することはできませんが、モジュールは提供します。これはうまくいきません:

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

build_html独自のパラメーターを使用して、内部的に渡す関数を呼び出したいです。

ここであなたは起こることを許していません。代わりに、 を呼び出すform()前に呼び出しbuild_html()てから、結果へのスカラー参照を渡します。build_htmlこれは、そのスカラー参照をサブルーチン参照として使用しようとするため、後で失敗します。

解決策: を使用するだけです\&form。フィールドに入力するには別の方法が必要です。

また:

  • フォームの検証は非常に一般的なタスクです。成熟した Perl モジュールが利用可能で、これに広く使用されています (たとえば、HTML::FormFuおよびData::Formvalidator)。Javascript 検証を追加するように見える関連モジュールもいくつかあります ( HTML::FormFu::ExtJSJavaScript::DataFormValidator)。独自のものを作成する前に、これらを確認することをお勧めします。
  • 最新の Perl Web 開発のほとんどは、何らかの Web フレームワークを使用して行われます。利用可能なフレームワークは非常に強力で、最も単純なプロジェクトを除くすべてのプロジェクトで使用する価値があります。フレームワークを使用した開発は従来の CGI 開発とはまったく異なり、学習曲線があるため、学習が目標である場合は、できるだけ早くフレームワークから始めることをお勧めします。私はCatalystに非常に満足しており、 MojoliciousDancerなどの他のオプションもあります。
于 2013-04-03T13:09:02.683 に答える