1
  #!/usr/bin/perl 
  # perl cgi script products2.cgi 


use DBI;
print <<END_HTML;
Content-type: text/html
END_HTML
my $host = "xxx.xxx.xxx";
my $port = "xxxx";
my $database = "proj4";
my $username = "xxxxxx";
my $password = "xxxxx";
my $database_source = "dbi:mysql:$database:$host:$port";


my $dbh = DBI->connect($database_source, $username, $password) 
or die 'Cannot connect to db';

my $sth = $dbh->prepare("SELECT distinct category FROM products");
$sth->execute();

#getting the categories and displaying them
while(my @row=$sth->fetchrow_array()) {
my $data =$row[0];
 my @values = split(' ',$data);
my $pic = "/~xxxx/proj4/images/".$values[0].".jpg";
print <<END_HTML;
<div class="view view-first">
END_HTML

print"<img src=\"$pic\" alt=\"$row[0]\"/>"; 
print "<h2 class=\"choc\"><span>$row[0]</span></h2>";
print "<div class=\"mask\">"; 
print "<h2 class=\"eff\">\"$row[0]\"</h2>";
print <<END_HTML; 
 <p>One of Our best sellers</p>  
     <a href="#" class="info $values[0]">Discover</a>  
 </div>   
 </div>  
END_HTML
 }


 $sth->finish();
 $dbh->disconnect();

我正在尝试替换

  <div id="content"></div> 

单击导航栏中的“产品”链接时,在我的 proj.html 到上述 perl 脚本的输出。

//产品导航栏

 <li>
<a href="/perl/xxxxx/products2.cgi" id="productit">
Products
</a>
 </li>

我知道我必须使用 javascript 和 ajax,但不知道该怎么做。

 $('#productit').bind('click', function() {

 var handle = document.getElementById('content');

  var req = new HttpRequest('/perl/xxxxx/products2.cgi', callback); 
  //i know this ajax call only expects string to be returned from server
 req.send();  

 handle.innerHTML= //not sure how to populate this                  
 });

有人可以指导我如何发送准备从 perl 脚本显示的 html

4

2 回答 2

1

您所要做的就是print将 HTML 发送到客户端/浏览器。

然而...

我注意到您的 Perl 代码中的一个小细节会导致 Web 服务器抛出 500 Internal Server Error:您忘记在 HTTP 标头后打印一个空行。发布的代码将发送输出

Content-type: text/html
<div class="view view-first">
...

这不是有效的 HTTP 响应,因为<div它不是可识别的 HTTP 标头。它需要发送

Content-type: text/html

<div class="view view-first">
...

相反,在内容开始之前用空行表示标题的结束。

这就是为什么使用 Web 框架(例如DancerMojoliciousCatalyst)甚至是神秘的CGI.pm而不是手动处理这些东西通常是一个好主意的原因之一:有很多小细节和奇怪的边缘您需要正确处理的情况,否则它将无缘无故地无法工作。如果这是一个学习练习,那么自己动手就可以了,了解所有这些陷阱在哪里很好,但是最好使用广泛使用且经过良好测试的模块在代码中处理它们,其目的是有用或重要的东西。

于 2012-12-05T10:11:36.243 回答
0

您可以使用 $.ajax() 方法,因为您使用的是 jquery

$('#productit').bind('click', function(e) {
   var handle = document.getElementById('content');
   e.preventDefault();

   $.ajax({
      dataType : 'text', /* the datatype you are returning */
      url: '/perl/xxxxx/products2.cgi',
      success:function (data){ /* data is the data returned from the ajax call */
          handle.innerHTML = data;
      } 
   });            
});
于 2012-12-05T05:52:41.043 回答