CGI-BBS > 基礎 > その他 > データファイルを読み込んみ複数ページに分けて表示したい


カレッヂ
カレッヂ


質問者 DEKKUN  投稿日 7/3(水) 22:19:09
なにぶん知識不足なので教えてもらえませんか。

WEBページの更新作業でパターンが一定なので、CGIプログラムでデータを抽出して
1ページ10ブロックを数ページに分けて表示し、最終的には複数のHTMLファイルにしたいと
思っています。このごろ少し意味が分かるようになってきてプログラムに挑戦しているん
ですが。実践パールプログラミングで解説されていたページ処理のセグメントを参考に
しているんですが、という言うよりほとんどそのまま使っているんですが、最初のページ
は表示されるのですが、次のページが出てこないのです。なにか、勘違いしているみたい
なのですが、だれか教えてもらえないでしょうか。
データは、txtのEUCファイルでカンマで区切らています。
これらの作業はローカル環境(WIN_NT4.0_Server)、アクティブパールで行いたいのです。

プログラムは下記のとおりです。

#!C:/Perl/bin/perl


if (!open (IN, "cms.txt"))
  { &error ('エラー','データが読み出せません'); }


$ff = $in{ 'next_num' };
if ($ff eq "") { $ff = 1; } 
$psize = 10;
while ($line = <IN>) {

    $page_control++;
    if ($ff > $page_control) { next; }

    $hit++;
    $line =~ s/\n//;
    @pickup = split(/,/,$line);

    if ($hit > $psize) { $next_num = $page_control; last; }

    else { push (@pickup,$line); }

print <<EOF;

<html>
<head>
<title>私のおすすめ</title>
<Content-type: text/html>

</head>

<body bgcolor="#ffffff" topmargin="35" leftmargin="0" MARGINHEIGHT="35" MARGINWIDTH="0" onLoad="Imges()">
<table width="700" border="0" cellpadding="2" cellspacing="1">

  <tr> 
    <td width="140"> </td>
    <td width="140"> </td>
    <td width="140"> </td>
    <td width="140"> </td>
    <td width="140"> </td>
  </tr>
  <tr class="titles"> 
    <td colspan="2" bgcolor="#6666FF">園名</td>
    <td bgcolor="#6666FF">TEL</td>
    <td colspan="2" bgcolor="#6666FF">住所</td>
  </tr>
  <tr class="style-03"> 
    <td colspan="2"><b>$pickup[0]</b></td>
    <td>$pickup[1]</td>
    <td colspan="2">$pickup[2]</td>
  </tr>
  <tr> 
    <td> </td>
    <td bgcolor="#999999" class="titles">放送日</td>
    <td bgcolor="#999999" class="titles">放送時刻</td>
    <td bgcolor="#999999" class="titles">再放送日</td>
    <td bgcolor="#999999" class="titles">再放送時刻</td>
  </tr>
  <tr class="style-03"> 
    <td>■わたしとダンス</td>
    <td>$pickup[3]</td>
    <td>$pickup[4]</td>
    <td>$pickup[5]</td>
    <td>$pickup[6]</td>
  </tr>
  <tr class="style-03"> 
    <td>■わたしとうたおう</td>
    <td>$pickup[7]</td>
    <td>$pickup[8]</td>
    <td> </td>
    <td> </td>
  </tr>
  <tr class="style-03"> 
    <td colspan="5">
      <hr size="1">
    </td>
  </tr>

EOF


print '</table></body></html>';

}

if ($next_num ne '') {
    print "<a href=cm.cgi?next_num=$next_num>次のページ</a>\n";
}


exit;

こんな感じなのですが、いかがでしょうか?
10ブロックを1ページとしています。
11ブロックで次ページ目に飛ばないのです。
最後のprint "<a href=cm.cgi?next_num=$next_num>次のページ</a>\n";
のところはブラウザーのアドレスには127.0.0.1/cm.cgi=11と表示されるだけです。
なにかが足りないのですかね?
教えてもらえないでしょうか?よろしくお願いします。

プロバイダ参照:http://www.mediawars.ne.jp
サーバのOS:WINサーバ
パソコンのOS:WinNT系
エディタ:秀丸
FTPソフト:ドリームウェーバー
サーバ移転:していない
改造:していない
CGI習熟度:middle

回答者 やまだ  [削除]  投稿日 7/4(木) 12:37:08
たぶん、$in{next_num}として、http://???/cm.cgi?next_num=2の?以降の値を
取り込んでいるつもりでしょうが、取り込めていませんよ。

このへんは、レスキューさんは、CGIパッケージを使わない独自の関数を使っているようです。
適当に好きなほうを使ってみてください。
質問者 DEKKUN  [削除]  投稿日 7/4(木) 21:09:58
すみません。CGIパッケージというのが解説書をなどを見てもいまいち理解できてなくて
クラスとかを使うというのでしょうか?
cm.cgi?next_num=$next_num>の値は11、の値を取り込む方法をもうすこし具体的に
教えてもらえないでしょうか?
知識不足で申し訳ありません。
回答者 やまだ  [削除]  投稿日 7/5(金) 01:19:30
例えば、次のような関数で、環境変数を使って?以下の文字列を引っ張ってこれます。

my $next_num=&get_query_str();

sub get_query_str(){
	my($buffer,$next_num);
	$ENV{'REQUEST_METHOD'} eq 'GET' and $buffer=$ENV{'QUERY_STRING'};
	for(split /&/,$buffer){
		my($key,$value)=split /=/;
		$value=~tr/+/ /;
		$value=~s/%([\dA-Fa-f0-9][\dA-Fa-f0-9])/pack("C",hex($1))/eg;
		{
			$key eq 'next_num' and $next_num=[split ' ',$value],last;
		}
	}
	($next_num);
}

パッケージモジュールを使う方法ってのは、

use CGI qw(:cgi-lib);
CGI::ReadParse;

my $next_num=$in{next_num};

で大丈夫なはず。

このページは終了したので返信(回答)は書きこめません

Web裏技