使用 jquery $.ajax() 调用 perl CGI

Calling perl CGI with jquery $.ajax()

我正在尝试通过 jQuery 的 ajax 调用来调用扩展名为 .cgi 的 perl 脚本,但运气不佳。在命令行上,应用程序运行良好,但是在单击事件后在浏览器中使用 JS 调用它时,似乎没有任何内容 returned.

如果有人能指出问题所在,我们将不胜感激。

FYI 权限设置为 755。apache2 处理程序设置为 .cgi .pl .py .ppl 和 .perl,所以我知道这不是处理程序或权限问题。

.js 文件

function getData() {

var data = $("#textBox").val(); // this contains a small string

    $.ajax({
        url:"/public_html/cgi-bin/emailSubList.cgi",
        type:"GET",
        data:"data="+data,
        async:false,
        success:function(res){
            alert("result is: " + res);
            }
       }); 
  }

.cgi perl 脚本

#!usr/local/bin/perl

use CGI;
use DBI;
use strict;

my $in = new CGI;
my $dataIn = $in->param('data');
#this connects, but I don't need to share the login to all
my $dbh = DBI->connect("DBI:mysql:database:username:password);
my $sth;
my $result;

$sth = $dbh->prepare("SELECT id FROM dataList WHERE data=?");
$sth->execute($dataIn);

my @res = $sth->fetchrow_array();

if(@res > 0) {
    $result = 'Data has already been submitted';
}
else {
$sth = $dbh->prepare("INSERT INTO dataList ($dataIn) VALUES (?)");
$sth->execute($dataIn);

$result = 'Data added!';
}

print $in->header('text/plain;charset=UTF-8');
print "$result";

更新:抛出一个错误,500 内部服务器错误,但我不明白为什么,因为权限是 755 并且使用 perl -wc script_name.cgi 语法检查正常调试这个或其他要检查的东西会很有帮助。

上面是通过网页中的点击事件调用的,但它似乎没有执行 perl 应用程序。这里的目标是通过简单的 ajax 调用将数据发送到数据库,然后 return 它或其他东西从同一个数据库发送。

只是注意到我在发布的脚本中看到的一些问题。抱歉,如果这些是从发布到 Whosebug 的复制粘贴错误,而不是核心问题。

  1. 数据库连接字符串缺少右引号。

  1. 插入语句看起来不正确

$sth = $dbh->prepare("INSERT INTO dataList ($dataIn) VALUES (?)");

应该是:

$sth = $dbh->prepare("INSERT INTO dataList (data) VALUES (?)");

OP 已 post 发表评论,说明问题已解决。由于他似乎不想 post 为其他有类似问题的人解释这个问题,所以我会这样做。

如果您要将文件从 Windows 上传到 Unix/Linux 服务器,那么在 ASCII 模式下执行此操作很重要。这样,所有 Windows 风格的行尾字符都会自动转换为 Unix 风格的行尾字符。如果你不这样做,那么当你的文件到达服务器时,它似乎都在一行上(因为 Windows 风格的行尾字符将无法识别)。

这对于使用 shebang 行执行的程序尤其重要(当然,Perl 程序也属于该类别)。 shebang 行应该包含用于执行代码的程序的路径。如果那条线没有结束,你很可能会得到一些非常奇怪的行为。

值得再补充几点:

  • 这个问题几乎肯定会在网络服务器错误日志中留下有用的信息。
  • 这是非常值得在您将用于部署的同一平台上进行开发的一个很好的理由。有了适用于所有平台(包括 Windows)的免费虚拟机环境,您没有理由不能在 Windows 机器上使用 Linux 进行开发。