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

HTML を作成するだけでprint、クライアント/ブラウザに送信されます。

でも...

Web サーバーが 500 Internal Server Error をスローする原因となる Perl コードの小さな詳細に気付きました: HTTP ヘッダーの後に空白行を出力するのを忘れました。投稿されたコードは出力を送信します

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

<divこれは、認識された HTTP ヘッダーではないため、有効な HTTP 応答ではありません。送信する必要があります

Content-type: text/html

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

代わりに、コンテンツの開始前にヘッダーの終わりを示す空白行を追加します。

これは、Web フレームワーク ( DancerMojolicious、またはCatalystなど) や、これらを手動で処理する代わりに難解なCGI.pmを使用することが一般的に良い考えである理由の 1 つです。そうしないと、明らかな理由もなく機能しません。これが学習課題である場合は、独自のものを展開することは問題ありません。これらすべての落とし穴がどこにあるかを学ぶのは良いことですが、広く使用され、十分にテストされたモジュールを使用して、目的のコードでそれらを処理することをお勧めします。有用または重要な何か。

于 2012-12-05T10:11:36.243 に答える
0

jqueryを使用しているため、$。ajax()メソッドを使用できます

$('#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 に答える