-1

htmlフィールドにIDを入力した後、同じページで単純なmysqlリターンを実行しようとしました。

私はそれをajaxを介してperlスクリプトに送信しました。このスクリプトは、データベースで検索を実行し、名前の結果を取得する必要があります。

私はウェブを検索してさまざまなオプションを試しましたが、探しているものに対する正しい答えを見つけることができませんでした。

ID番号を取得してデータベースに送信し、このID連絡先の名前を取得しようとしています。

これが私のhtmlコードです:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<HTML xmlns="http://www.w3.org/1999/xhtml">
<head>
<script language="javascript" type="text/javascript">
var xmlHttp = new XMLHttpRequest();
</script>
<META charset="utf-8">
<TITLE>Ajax-tool</TITLE> 
</head>

<body>
<form id="procform" name="procform" method="POST" action="">
<b>Contact ID:</b>
<fieldset>
<input type="text" id="CID" name="CID" size="20" />
<p><input type="submit"></p>
</fieldset>
</form>
<p></p>
<div id="content"></div>

<SCRIPT type="text/javascript" src="/js/jquery.js"></SCRIPT>
<SCRIPT type="text/javascript" src="js/jquery-ui.min.js"></SCRIPT>
<SCRIPT type="text/javascript" src="/js/ajax01.js"></SCRIPT>
</body>
</HTML>

jQueryスクリプト:

$(document).ready(function() {
    $("form#procform").submit(function() {
    var id =    $("#CID").val();
    var jsondata = { 'CID' : id };
        $.ajax({
            type: "POST",
            url: "http://192.168.10.1/cgi-bin/ajax01.pl",
                async: false,
                contentType: "application/json; charset=utf-8",
            dataType: "json",
            data: {CID: id},
            success: function(result) {
                $("div#content").text("data.success: " + data);
                //alert(data);
            },
            error: function (request, status, error) {
                alert(request.responseText);
            }
        });
//alert( + id + "");
    });
});

そしてperlスクリプト:

#!/usr/bin/perl -T


use CGI ":all";
use DBI;
#use strict;
use warnings;
use Encode;
use JSON;
use Storable;
#$foo = CGI->new;



#$foo->charset('utf-8');
$json = JSON->new->allow_nonref;

$dbh = DBI->connect('mylogin)
                || die "Could not connect to database: $DBI::errstr";
#my $cidID   = CGI->new->param( 'CID' );


my $cidID   = $json->decode('CID');
#my $cidID  = $foo->param('CID');
#$cidID = 44;

#########    select contact name from contacts    ##############
$sth0 = $dbh->prepare("SELECT * FROM  contacts WHERE cid= $cidID")or "can't prepare : $DBI::errstr\n";

$sth0->execute()or die "Can't execute: $DBI::errstr\n";

@row0 = $sth0->fetchrow_array;

my $VCName3 = $row0[1];

$sth0->finish();
print $VCName3;

my $json1 = $json->encode($VCName3);

print $foo->header(-type => "application/json", -charset => "utf-8");
print $json1;

perlスクリプト内でcidIDに値を指定し、jsonのヘッド部分の定義全体を削除すると、cidIDに対して正しい結果が得られます。

しかし、問題はajaxからcidIDに正しいデータを取得することです。

アップデート

私はここで新しいので、上の部分を消去するか、他の人が学ぶためにそれを残すかどうかわかりません。

ただし、例として、Webを再確認し、コードにいくつかの変更を加えました-

ajaxでメソッドを「POST」から「GET」に変更しました

現在は機能していますが、POSTで機能しない理由がわかりません。何かアイデアはありますか?

しかし、結果をDIVに表示したい場合は、一瞬点滅し、そこに留まりません。

そして、jqueryでさらに使用するために結果を変数に戻す方法はありますか?私は試した -

var result = $(data.userid);

成功せずに。

ここにそれらが機能する方法のコードがあります-

HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<HTML xmlns="http://www.w3.org/1999/xhtml">
<head>
<script language="javascript" type="text/javascript">
var xmlHttp = new XMLHttpRequest();
</script>
<META charset="utf-8">
<TITLE>Ajax-tool</TITLE> 
</head>

<body>

<form id="procform" name="procform" method="POST" action="">
<b>Contact ID:</b>
<fieldset>
<input type="text" id="CID" name="CID" size="20" />
<p><input type="submit"></p>
</fieldset>
<p></p>
<div id="content"></div>
</form>
<SCRIPT type="text/javascript" src="http://192.168.10.1/js/jquery.js"></SCRIPT>
<SCRIPT type="text/javascript" src="http://192.168.10.1/js/jquery-ui.min.js"></SCRIPT>
<SCRIPT type="text/javascript" src="http://192.168.10.1/js/ajax01.js"></SCRIPT>
</body>
</HTML>

JQUERY

$(document).ready(function() {
    $("form#procform").submit(function() {
    var id =    $("#CID").val();
    var jsondata = { 'CID' : id };
        $.ajax({
            type: "GET",
            url: "http:/cgi-bin/ajax01_1.pl",
                async: false,
                contentType: "application/json; charset=utf-8",
            dataType: "json",
            data: "CID=" + id,
            success: function(data) {
                $("div#content").append("Name: " + data.userid);
                //alert("Name: " + data.userid);
            },
            error: function (request, status, error) {
                alert(request.responseText);
            }
        });
    });
});

PERL

use DBI;
use strict;
use warnings;
use Encode;
my $foo = CGI->new;
my $cidID = $foo->param("CID");

my $dbh = DBI->connect('here goes my login passw ect..')
                || die "Could not connect to database: $DBI::errstr";

my @row0;
#########    select contact name from contacts    ##############
my $sth0 = $dbh->prepare("SELECT * FROM  contacts WHERE cid= ?")or "can't prepare : $DBI::errstr\n";

$sth0->execute($cidID)or die "Can't execute: $DBI::errstr\n";

@row0 = $sth0->fetchrow_array;

my $VCName3 = $row0[1];

$sth0->finish();
print $VCName3;

my $json1 = ($VCName3)? 
  qq{{"success" : "login is successful", "userid" : "$VCName3"}} : 
  qq{{"error" : "username or password is wrong"}};;

print $foo->header(-type => "application/json", -charset => "utf-8");
print $json1;
4

1 に答える 1

6

あなたの Perl スクリプトは奇妙に満ちています。実際に問題があるのではないかと考える前に、これらの奇妙な点を修正することをお勧めします。

  1. use strict. 真剣に。これにより、バグの多くのソースが指摘されます。そして、変数を宣言する必要があります( を使用my)。それは良いことです。
  2. $foo = CGI->new実際にそのオブジェクトを後で使用するため、のコメントを外します。しかし、そのためには、変数をオブジェクトで初期化する必要があります。また、名前を適切な名前に変更し、変数を宣言しますmy $cgi = CGI->new;→ 記念碑的な CGI ドキュメント
  3. の周りの引用を忘れました'mylogin
  4. ああ、あなたdieが死んだら、そのエラーメッセージがログに残ります。そのプログラムはさらに多くのエラーを生成するため、かなりの数のエントリが蓄積されているはずです。多分それらを見て、問題を修正してください!また、開発中にブラウザーにエラーを送信することもできます。でこれを行いuse CGI::Carp qw/fatalsToBrowser/;ます。→ CGI::鯉のドキュメンテーション
  5. JSON ドキュメントを読んでください。decodeand notdecode_jsonが本当に必要なものであることを確認してください( decode_jsonUTF-8 を想定しています)。どちらのメソッドも JSON 文字列を必要とします。Perl 文字列my $not_json = q/CID/は有効な JSONではありません。それはそうでしょうmy $json = q/"CID"/。引用符を参照してください。
  6. POST または GET 要求からパラメーターを読み取りたいと考えています。ヒント 2 に従うと、再び機能するはずです。
  7. 私はSQLを知りませんが、あなたが間違っていることは知っています。変数を SQL ステートメントに補間しないでください。そうしないと、インジェクション攻撃を招きます。パラメータ化されたステートメントを使用します:my $sth = $dbh->prepare('SELECT * FROM contacts WHERE cid = ?') or die ...次に、実際の変数をパラメータとして実行します$sth->execute($cidID) or die ...
  8. $sth->fetchrow_array1 行だけをフェッチしますが、すべての行を選択しました。最初の行のみを選択するように SQL を修正するか、すべての行をループしてください。while (my @row = $sth->fetchrow_array){ do something @row }. →DBIドキュメント
  9. ヘッダーを印刷するprint $VCName3前に!これにより、多くの500エラーが発生する可能性があります。そうしないでください。
  10. JSON が として送信されるように指定しますUTF-8。おそらく、 を使用する必要がありますencode_json

[ここに十戒に関するジョークを挿入]

これらの問題を修正した後、問題が残っている場合と残っていない場合があります。その場合は、質問を更新して、そうしたというコメントをドロップしてください。次に、これらの実際の問題をどのように解決できるかを見ていきます。

于 2013-02-10T10:22:19.360 に答える