-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 中。

更新

我是新来的,所以我不知道是要删除上面的部分还是留给其他人学习..

但是-作为示例,我再次查看了网络并对代码进行了一些更改-

在 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>

查询

$(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. 哦,当你dieing 的时候:如果你死了,那条错误信息最终会出现在你的日志中。该程序将产生更多错误,因此您应该积累了相当多的条目。看看他们也许,并解决问题!此外,您可能希望在开发期间向浏览器发送错误。用use CGI::Carp qw/fatalsToBrowser/;. → CGI::Carp 文档
  5. 阅读JSON 文档。确保那decode不是decode_json你真正想要的东西(decode_json假设是 UTF-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_array仅获取一行,但您选择了所有行。要么修复你的 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 回答