週替わりランキングを作成cgiを探しています。
1位~10位までで、表示項目が4つ以上表示されるものを探しています。
自動でなく、手動で構いません。
ただ、2項目のみどうしてもリンクを設けたいのです。
┏━━┳━━━┳━━━┳━━━┳━━━┓
┃1位┃AAA┃BBB┃CCC┃DDD┃
┣━━╋━━━╋━━━╋━━━╋━━━┫
┃2位┃AAA┃BBB┃CCC┃DDD┃
┣━━╋━━━╋━━━╋━━━╋━━━┫
できれば、過去ログを見れるものであればいいのですが、過去ログはこだわりません
cgi、htmlのどちらの表示でもかまいません。
perlかphpで希望する機能に近いもの、希望そのもののスクリプトをご存じの方がお
られましたら、よろしくお願い致します。
No.3ベストアンサー
- 回答日時:
#1 です。
あまり、綺麗なソースではありませんが。。。
entry.cgi
entry.thtml
ranking.thml
の3ファイルで1セットです。このファイルは全て、【日本語EUC】で保存する。と言う事を前提にしています。
entry.thtml, ranking.thtml の拡張子が変わっていますが、書き間違えではありません。必ず「.thtml」と指定してください。
HTML部分を、CGIから分離するために、HTML::Templateと言うモジュールを利用しています。このモジュールが無いため動作しない。と言う事は無いとは思いますが、必要であればサーバーの管理者に問い合わせてください。
インターフェースは、かなり手抜きです。
1. 起動すると、今週の日曜日の日付と、入力欄が表示されます。
2. 日付を指定して、データを打ち込み、「登録」をクリックすると、データが書き込まれます。(入力欄のチェックなどは、まったく行っていません。)
3. 日付を指定して、「読込」をクリックすると指定された日付のデータを読み込みます。修正して「登録」をクリックすると、データが更新されます。(日付が指定されていない。指定された日付のデータが存在しない場合には、エラーが表示されます。)
4. 「生成」をクリックすると、静的HTMLファイルが生成されます。(ファイル名は、$conf{'htmlfile'}の定義で決まっています。各ファイルへの自動リンク機能などはありません。)
5. 「リロード」は、エラーが表示された時、初期表示に戻すために用意してあります。
カスタマイズ
entry.thtml, ranking.thtml は、基本的にHTMLの文法で書かれています。ですので、このファイルを修正して頂ければ、サイトのイメージに合う体裁を作る事ができます。
途中、<TMPL_VAR NAME=なんとか>, <TMPL_LOOP NAME=なんとか>と言う文字列がでてきますが、HTML::Template の機能により、CGI側から埋め込んでいるデータなので、この部分は修正しないでください。(周りのHTMLは自由に修正して大丈夫です。)
生成されるHTMLファイルのファイル名は、$conf{'htmlfile'}で指定しています。%y, %m, %dがそれぞれ、from日付の年, 月, 日に対応して埋め込まれます。
データが数週分存在すると、生成されるHTMLファイルも複数になります。
$conf{'keywords'}, $conf{'description'}, $conf{'pagename'} は、HTMLの<head>~</head>に埋め込む、キーワード, 概要, ページタイトルです。適当に埋め込んでください。
$max の値を変更すると、ランキング数が変わります。
その他機能については、ご自分で修正, 追加して頂くか、ご要望を頂けば修正しますが、来月(明日)より、年末まで少し忙しくなる予定なので、レスポンスが極端に遅くなる可能性があります。(例えば、週末だけ。とか。)ご了承下さい。
----- ^^^ entry.cgi ^^^ -----
#!/usr/local/bin/perl
use HTML::Template;
use Jcode;
use CGI;
use strict;
my($max, $datafile);
my($cgi, %in);
my($i, @rdata, %conf);
$max = 10;
$datafile = 'ranking.txt';
$conf{'keywords'} = '';
$conf{'description'} = '';
$conf{'pagename'} = '';
$conf{'htmlfile'} = 'ranking%y%m%d.html';
$cgi = new CGI;
$in{'smode'} = $cgi->param('smode');
$in{'yy'} = $cgi->param('yy');
$in{'mm'} = $cgi->param('mm');
$in{'dd'} = $cgi->param('dd');
for ($i = 0; $i < $max; $i++) {
$in{"item$i"} = $cgi->param("item$i");
$in{"itemurl$i"} = $cgi->param("itemurl$i");
$in{"maker$i"} = $cgi->param("maker$i");
$in{"value$i"} = $cgi->param("value$i");
}
&readdatafile(\@rdata);
if ($in{'smode'} eq '読込') {
&dispday(\@rdata);
}
elsif ($in{'smode'} eq '登録') {
&updatedatafile(\@rdata);
&disp();
}
elsif ($in{'smode'} eq '生成') {
&makehtml(\@rdata);
&disp();
}
else {
&disp();
}
exit(0);
sub disp {
my($i, @entry_loop, $template);
my($yy, $mm, $dd, $week);
my(@mmax) = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$template = HTML::Template->new(filename => 'entry.thtml');
($yy, $mm, $dd, $week) = (localtime(time))[5, 4, 3, 6];
$yy += 1900;
$mm++;
if ($week != 0) {
if (($yy % 4) == 0) {
$mmax[1] = 29;
if (($yy % 100) == 0) {
$mmax[1] = 28;
if (($yy % 400) == 0) {
$mmax[1] = 29;
}
}
}
$dd -= $week;
if ($dd < 0) {
$mm--;
if ($mm == 0) {
$yy--;
$mm = 12;
}
$dd += $mmax[$mm-1];
}
}
$template->param(YY => $yy);
$template->param(MM => $mm);
$template->param(DD => $dd);
for ($i = 0; $i < $max; $i++) {
my(%row);
$row{'RANK'} = $i+1;
$row{'ITEM'} = qq|<input type="text" name="item$i" size="40">|;
$row{'ITEMURL'} = qq|<input type="text" name="itemurl$i" size="80">|;
$row{'MAKER'} = qq|<input type="text" name="maker$i" size="20">|;
$row{'VALUE'} = qq|<input type="text" name="value$i" size="7">|;
push(@entry_loop, \%row);
}
$template->param(ENTRY_LOOP => \@entry_loop);
$template->param(KEYWORDS => $conf{'keywords'});
$template->param(DESCRIPTION => $conf{'description'});
$template->param(PAGENAME => $conf{'pagename'});
print "Content-Type: text/html\n\n";
print $template->output;
}
sub dispday {
my($rdata) = @_;
my($i, $ymd, @d, @entry_loop, $template);
$template = HTML::Template->new(filename => 'entry.thtml');
if (($in{'yy'} eq '') ||
($in{'mm'} eq '') ||
($in{'dd'} eq '')) {
$template->param(ERROR => '日付が入力されていません。');
}
$ymd = join('/', $in{'yy'}, $in{'mm'}, $in{'dd'});
for ($i = 0; $i <= scalar(@{$rdata})-1; $i++) {
if ($rdata[$i]->{'from'} eq $ymd) {
$d[$rdata[$i]->{'rank'}-1] = $rdata[$i];
}
}
if (scalar(@d) == 0) {
$template->param(ERROR => '指定された日付のデータはありません。');
}
else {
$template->param(YY => $in{'yy'});
$template->param(MM => $in{'mm'});
$template->param(DD => $in{'dd'});
for ($i = 0; $i < $max; $i++) {
my(%row);
$row{'RANK'} = $i+1;
$row{'ITEM'} = qq|<input type="text" name="item$i" size="40" |
. qq|value="|. $d[$i]->{'item'}. qq|">|;
$row{'ITEMURL'} = qq|<input type="text" name="itemurl$i" size="80" |
. qq|value="|. $d[$i]->{'itemurl'}. qq|">|;
$row{'MAKER'} = qq|<input type="text" name="maker$i" size="20" |
. qq|value="|. $d[$i]->{'maker'}. qq|">|;
$row{'VALUE'} = qq|<input type="text" name="value$i" size="7" |
. qq|value="|. $d[$i]->{'value'}. qq|">|;
push(@entry_loop, \%row);
}
$template->param(ENTRY_LOOP => \@entry_loop);
}
$template->param(KEYWORDS => $conf{'keywords'});
$template->param(DESCRIPTION => $conf{'description'});
$template->param(PAGENAME => $conf{'pagename'});
print "Content-Type: text/html\n\n";
print $template->output;
}
sub makehtml($) {
my($rdata) = @_;
my($i, %d, $day);
my($yy, $mm, $dd);
my($template, $htmlfile, @fd, @td, @entry_loop);
for ($i = 0; $i <= scalar(@{$rdata})-1; $i++) {
$d{$rdata[$i]->{'from'}}[$rdata[$i]->{'rank'}-1] = $rdata[$i];
}
foreach $day (sort keys %d) {
(@fd) = split(m|/|, $d{$day}[0]->{'from'});
(@td) = split(m|/|, $d{$day}[0]->{'to'});
$htmlfile = $conf{'htmlfile'};
$yy = sprintf("%04d", $fd[0]);
$mm = sprintf("%02d", $fd[1]);
$dd = sprintf("%02d", $fd[2]);
$htmlfile =~ s/%y/$yy/g;
$htmlfile =~ s/%m/$mm/g;
$htmlfile =~ s/%d/$dd/g;
$template = HTML::Template->new(filename => 'ranking.thtml');
$template->param(FROMDAY => sprintf("%4d年%2d月%2d日", @fd));
$template->param(TODAY => sprintf("%4d年%2d月%2d日", @td));
@entry_loop = ();
for ($i = 0; $i < $max; $i++) {
my(%row);
$row{'RANK'} = $i+1;
$row{'ITEM'} = qq|<a target="_blank" |
. qq|href="|. $d{$day}[$i]->{'itemurl'}. qq|"|
. qq|title="|. $d{$day}[$i]->{'item'}. qq|">|
. $d{$day}[$i]->{'item'}
. qq|</a>|;
$row{'MAKER'} = $d{$day}[$i]->{'maker'};
$row{'VALUE'} = $d{$day}[$i]->{'value'};
push(@entry_loop, \%row);
}
$template->param(ENTRY_LOOP => \@entry_loop);
open(HTML, "> $htmlfile") || die("Panic! open error $htmlfile");
print HTML $template->output(). "\n";
close(HTML);
}
}
sub readdatafile($) {
my($rdata) = @_;
my($from, $rank, $item, $itemurl, $maker, $value);
if (-f $datafile) {
open(IN, $datafile) || die("Panic! open error $datafile");
while(<IN>) {
chop;
($from, $rank, $item, $itemurl, $maker, $value) = split(m/<>/);
my(%d);
$d{'from'} = $from;
$d{'to'} = &add7day($from);
$d{'rank'} = $rank;
$d{'item'} = $item;
$d{'itemurl'} = $itemurl;
$d{'maker'} = $maker;
$d{'value'} = $value;
push(@{$rdata}, \%d);
}
close(IN);
}
}
sub updatedatafile($) {
my($rdata) = @_;
my($ymd, $i, @work, $line);
$ymd = join('/', $in{'yy'}, $in{'mm'}, $in{'dd'});
for ($i = 0; $i <= scalar(@{$rdata}-1)-1; $i++) {
if ($rdata[$i]->{'from'} ne $ymd) {
push(@work, $rdata[$i]);
}
}
for ($i = 0; $i < $max; $i++) {
my(%d);
$d{'from'} = $ymd;
$d{'rank'} = $i+1;
$d{'item'} = $in{"item$i"};
$d{'itemurl'} = $in{"itemurl$i"};
$d{'maker'} = $in{"maker$i"};
$d{'value'} = $in{"value$i"};
push(@work, \%d);
}
@work = sort sortsub @work;
open(OUT, "> $datafile") || die("Panic! open error $datafile");
for ($i = 0; $i <= scalar(@work)-1; $i++) {
$line = join('<>', $work[$i]->{'from'}
, $work[$i]->{'rank'}
, $work[$i]->{'item'}
, $work[$i]->{'itemurl'}
, $work[$i]->{'maker'}
, $work[$i]->{'value'});
print OUT $line. "\n";
}
close(OUT);
}
sub sortsub {
$a->{'from'} cmp $b->{'from'} ||
$a->{'rank'} <=> $b->{'rank'};
}
sub add7day($) {
my($day) = @_;
my($y, $m, $d);
my(@max) = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
if (($y % 4) == 0) {
$max[1] = 29;
if (($y % 100) == 0) {
$max[1] = 28;
if (($y % 400) == 0) {
$max[1] = 29;
}
}
}
($y, $m, $d) = split(m|/|, $day);
$d += 7;
if ($max[$m-1] < $d) {
$d -= $max[$m-1];
$m++;
if ($m == 12) {
$m = 0;
$y++;
}
}
$day = join('/', $y, $m, $d);
($day);
}
----- $$$ entry.cgi $$$ -----
----- ^^^ entry.thtml ^^^ -----
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<meta name="keywords" content="<TMPL_VAR NAME="KEYWORDS">">
<meta name="description" content="<TMPL_VAR NAME="DESCRIPTION">">
<title><TMPL_VAR NAME="PAGENAME"></title>
</head>
<body>
<div align="left">
<form action="entry.cgi" method="post">
<font color="#ff0000">
<TMPL_VAR NAME=ERROR>
</font>
<p align="left">
<input type="text" name="yy" size="4" value="<TMPL_VAR NAME=YY>">年
<input type="text" name="mm" size="2" value="<TMPL_VAR NAME=MM>">月
<input type="text" name="dd" size="2" value="<TMPL_VAR NAME=DD>">日
</p>
<table border="1">
<tr>
<th align="center">順位</th>
<th align="center">商品名</th>
<th align="center">商品URL</th>
<th align="center">メーカー</th>
<th align="center">在庫数</th>
</tr>
<TMPL_LOOP NAME=ENTRY_LOOP>
<tr>
<td align="right"><TMPL_VAR NAME=RANK></td>
<td align="left"><TMPL_VAR NAME=ITEM></td>
<td align="left"><TMPL_VAR NAME=ITEMURL></td>
<td align="left"><TMPL_VAR NAME=MAKER></td>
<td align="left"><TMPL_VAR NAME=VALUE></td>
</tr>
</TMPL_LOOP>
</table>
<p align="center">
<input type="submit" value="読込" name="smode">
<input type="submit" value="登録" name="smode">
<input type="submit" value="生成" name="smode">
<input type="submit" value="リロード" name="smode">
</p>
</div>
</form>
</body>
</html>
----- $$$ entry.thtml $$$ -----
----- ^^^ ranking.thtml ^^^ -----
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<meta name="keywords" content="<TMPL_VAR NAME="KEYWORDS">">
<meta name="description" content="<TMPL_VAR NAME="DESCRIPTION">">
<title><TMPL_VAR NAME="PAGENAME"></title>
</head>
<body>
<p align="center">
<TMPL_VAR NAME=FROMDAY>~<TMPL_VAR NAME=TODAY>のランキング
</p>
<div align="center">
<table border="1">
<tr>
<th align="center">順位</th>
<th align="center">商品名</th>
<th align="center">メーカー</th>
<th align="center">在庫数</th>
</tr>
<TMPL_LOOP NAME=ENTRY_LOOP>
<tr>
<td align="right"><TMPL_VAR NAME=RANK></td>
<td align="left"><TMPL_VAR NAME=ITEM></td>
<td align="left"><TMPL_VAR NAME=MAKER></td>
<td align="right"><TMPL_VAR NAME=VALUE></td>
</tr>
</TMPL_LOOP>
</table>
</div>
</body>
</html>
----- $$$ ranking.thtml $$$ -----
この回答への補足
度々のご返信ありがとうございました
まさか作成してもらえるとは思いませんでした…
設置したのですが500のエラーが発生してしまい、perlチェッカーで調べてみた所、、どうもHTML::Templateモジュールがないようでした
専用サーバーの為、インストールするには自分でおこなわなければならない事と、telnetでsuでのログインするには実家から接続しなければならない事ですぐに対応ができません…
サーバー管理会社に、事務所から接続するホスト名を伝えればなんとかなるので、さきほど事務所から作業できるように手配しました
なんとか、HTML::Templateモジュールのインストールをがんばってみます。
また、ご報告させて頂きます。
本当にありがとうございました。
No.6
- 回答日時:
再び Dpop です。
add6dayですが(以前は、add7day でした。)、7を足してしまうと次の日曜日になってしまうので、6を足すように変更してあります。
書き忘れました。
ついでに。項目を増やす程度なら、誰でもできます。
qq|| と言う表現が良くでてきますが、""と同じ意味です。単にその文字列の中でダブルクォーテーションを使いたく、\"\"とするのが面倒だったので、qq||で代用しただけの事です。
■entry.cgi
●パラメータを受け取る部分。
for ($i = 0; $i < $max; $i++) {
$in{"item$i"} = $cgi->param("item$i");
$in{"itemurl$i"} = $cgi->param("itemurl$i");
$in{"maker$i"} = $cgi->param("maker$i");
$in{"makerurl$i"} = $cgi->param("makerurl$i");
$in{"value$i"} = $cgi->param("value$i");
}
の部分に、受け取りたいパラメータを追加します。(本日、makerurl$i(makerurl + 行番号と言う名前。)を追加しましたが、こんな要領です。)
●disp処理
for ($i = 0; $i < $max; $i++) {
my(%row);
$row{'RANK'} = $i+1;
$row{'ITEM'} = qq|<input type="text" name="item$i" size="30">|;
$row{'ITEMURL'} = qq|<input type="text" name="itemurl$i" size="50">|;
$row{'MAKER'} = qq|<input type="text" name="maker$i" size="20">|;
$row{'MAKERURL'} = qq|<input type="text" name="maker$i" size="50">|;
$row{'VALUE'} = qq|<input type="text" name="value$i" size="7">|;
push(@entry_loop, \%row);
}
entry.thtmlに引き渡す<input>タグを作っている部分です。$row{''}の中身は、必ず半角英数字の大文字で記述してください。name=""の部分は、$row{''}の中身と同じ物を小文字で記載し、その脇に$iを付けてください。順位毎に別々のパラメータを受けるための工夫です。
●dispday処理
for ($i = 0; $i < $max; $i++) {
my(%row);
$row{'RANK'} = $i+1;
$row{'ITEM'} = qq|<input type="text" name="item$i" size="30" |
. qq|value="|. $d[$i]->{'item'}. qq|">|;
$row{'ITEMURL'} = qq|<input type="text" name="itemurl$i" size="50" |
. qq|value="|. $d[$i]->{'itemurl'}. qq|">|;
$row{'MAKER'} = qq|<input type="text" name="maker$i" size="20" |
. qq|value="|. $d[$i]->{'maker'}. qq|">|;
$row{'MAKERURL'} = qq|<input type="text" name="makerurl$i" size="50" |
. qq|value="|. $d[$i]->{'makerurl'}. qq|">|;
$row{'VALUE'} = qq|<input type="text" name="value$i" size="7" |
. qq|value="|. $d[$i]->{'value'}. qq|">|;
push(@entry_loop, \%row);
}
disp処理とほぼ同じです。データファイルの中身を利用したい時には、$d[$i]->{'なんとか'}と書いてください。
●makehtml処理
for ($i = 0; $i < $max; $i++) {
my(%row);
$row{'RANK'} = $i+1;
$row{'ITEM'} = qq|<a target="_blank" |
. qq|href="|. $d{$day}[$i]->{'itemurl'}. qq|"|
. qq|title="|. $d{$day}[$i]->{'item'}. qq|">|
. $d{$day}[$i]->{'item'}
. qq|</a>|;
$row{'MAKER'} = qq|<a target="_blank" |
. qq|href="|. $d{$day}[$i]->{'makerurl'}. qq|"|
. qq|title="|. $d{$day}[$i]->{'maker'}. qq|">|
. $d{$day}[$i]->{'maker'}
. qq|</a>|;
$row{'VALUE'} = $d{$day}[$i]->{'value'};
push(@entry_loop, \%row);
}
固定HTMLに埋め込む表の部分です。disp処理とほぼ同じです。データファイルの中身を使いたい時には、$d{$day}[$i]->{'なんとか'}と書いてください。
●readdatafile処理
my($from, $rank, $item, $itemurl, $maker, $makerurl, $value);
データファイルに記録されているデータを格納するための変数を定義しています。項目を追加したら、対応する変数名を追加してください。
($from, $rank, $item, $itemurl, $maker, $makerurl, $value)
= split(m/,/, $line);
上で指定した変数名を追加してください。この追加する位置は、updatedatafile処理と同じ場所である必要があります。
$d{'from'} = $from;
$d{'to'} = &add6day($from);
$d{'rank'} = $rank;
$d{'item'} = $item;
$d{'itemurl'} = $itemurl;
$d{'maker'} = $maker;
$d{'makerurl'} = $makerurl;
$d{'value'} = $value;
単純に、$d{'なんとか'} = $なんとか; です。上記で追加した変数名から類推して指定します。
●updatedatafile処理
for ($i = 0; $i < $max; $i++) {
my(%d);
$d{'from'} = $ymd;
$d{'rank'} = $i+1;
$d{'item'} = $in{"item$i"};
$d{'itemurl'} = $in{"itemurl$i"};
$d{'maker'} = $in{"maker$i"};
$d{'makerurl'} = $in{"makerurl$i"};
$d{'value'} = $in{"value$i"};
push(@work, \%d);
}
入力されたパラメータをデータに追加する処理です。readdatafile処理と同様に追加してください。
for ($i = 0; $i <= scalar(@work)-1; $i++) {
$line = join(',', $work[$i]->{'from'}
, $work[$i]->{'rank'}
, $work[$i]->{'item'}
, $work[$i]->{'itemurl'}
, $work[$i]->{'maker'}
, $work[$i]->{'makerurl'}
, $work[$i]->{'value'});
# どうしても、SJISで保存した場合には、次のコメントを取ってください。
# $line = Jcode->new($line)->sjis;
print OUT $line. "\n";
}
データファイルへ書き込む部分です。join関数の中に、, $work[$i]->{'なんとか'}と追加してください。この追加位置と、readdatafileのsplitの位置が同じである必要があります。
■entry.thtml
<table border="1">
<tr>
<th align="center">順位</th>
<th align="center">商品名</th>
<th align="center">商品URL</th>
<th align="center">メーカー</th>
<th align="center">メーカーURL</th>
<th align="center">在庫数</th>
</tr>
<TMPL_LOOP NAME=ENTRY_LOOP>
<tr>
<td align="right"><TMPL_VAR NAME=RANK></td>
<td align="left"><TMPL_VAR NAME=ITEM></td>
<td align="left"><TMPL_VAR NAME=ITEMURL></td>
<td align="left"><TMPL_VAR NAME=MAKER></td>
<td align="left"><TMPL_VAR NAME=MAKERURL></td>
<td align="left"><TMPL_VAR NAME=VALUE></td>
</tr>
</TMPL_LOOP>
</table>
データ入力画面を作っている部分です。項目名と、入力領域を追加してください。<TMPM_VAR NAME=なんとか>は、追加した変数名から$を取って大文字にした物を指定してください。
■ranking.thtml
<div align="center">
<table border="1">
<tr>
<th align="center">順位</th>
<th align="center">商品名</th>
<th align="center">メーカー</th>
<th align="center">在庫数</th>
</tr>
<TMPL_LOOP NAME=ENTRY_LOOP>
<tr>
<td align="right"><TMPL_VAR NAME=RANK></td>
<td align="left"><TMPL_VAR NAME=ITEM></td>
<td align="left"><TMPL_VAR NAME=MAKER></td>
<td align="right"><TMPL_VAR NAME=VALUE></td>
</tr>
</TMPL_LOOP>
</table>
</div>
静的HTML用の表部分です。entry.thtmlと同様です。静的HTMLの場合、アンカータグ部分はCGI側で編集してしまうので、なんとかURLの様な物は追加してはなりません。(CGI側のmakehtmlで編集してください。)
頑張ってくださいね(^_^)
No.5
- 回答日時:
Dpop です。
あー。申し訳ない!! Jcode は使おうと思って use したのですが、結局使わなかったのです(^_^;;)
別のCGIを利用する時、利用するかも知れないので、良し。と言う事にしてください(^_^;;)
> ただ、商品名へのリンクはできたのですが、メーカーサイトへのリンクができていなかったので、これから少し手を入れていきたいと思うのですが少し不安です…
これについては、機能を追加しました。そのため、データフォーマットが変更になりますので、注意してください。
> 保存されたcsvを見てみたら、日本語が文字化けしてしまっています…
それは、違います。正しく保存されています。
初めにも書きましたが、全て「日本語EUC」で保存する。と言う事を前提としています。
ですので、日本語EUCを利用できるエディタで、開いていただければ問題なく確認できます。
UNIXの世界では、漢字コードは日本語EUCで保存します。一部の文字の文字化けを防ぐために必要な処置となります。
そのリスクがある事を承知で、どうしてもSJISで保存したい場合には、readdatafile, updatedatafile のコメントを外してください。(Jcodeの行です。)
この部分については、テストしていませんが、まぁ問題無いでしょう。
ranking.thtml には修正がありませんが、念のため3ファイルともアップしておきます。
----- ^^^ entry.cgi ^^^ -----
#!/usr/local/bin/perl
use HTML::Template;
use Jcode;
use CGI;
use strict;
my($max, $datafile);
my($cgi, %in);
my($i, @rdata, %conf);
$max = 10;
$datafile = 'ranking.csv';
$conf{'keywords'} = '';
$conf{'description'} = '';
$conf{'pagename'} = '';
$conf{'htmlfile'} = 'ranking%y%m%d.html';
$cgi = new CGI;
$in{'smode'} = $cgi->param('smode');
$in{'yy'} = $cgi->param('yy');
$in{'mm'} = $cgi->param('mm');
$in{'dd'} = $cgi->param('dd');
for ($i = 0; $i < $max; $i++) {
$in{"item$i"} = $cgi->param("item$i");
$in{"itemurl$i"} = $cgi->param("itemurl$i");
$in{"maker$i"} = $cgi->param("maker$i");
$in{"makerurl$i"} = $cgi->param("makerurl$i");
$in{"value$i"} = $cgi->param("value$i");
}
&readdatafile(\@rdata);
if ($in{'smode'} eq '読込') {
&dispday(\@rdata);
}
elsif ($in{'smode'} eq '登録') {
&updatedatafile(\@rdata);
&disp();
}
elsif ($in{'smode'} eq '生成') {
&makehtml(\@rdata);
&disp();
}
else {
&disp();
}
exit(0);
sub disp {
my($i, @entry_loop, $template);
my($yy, $mm, $dd, $week);
my(@mmax) = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$template = HTML::Template->new(filename => 'entry.thtml');
($yy, $mm, $dd, $week) = (localtime(time))[5, 4, 3, 6];
$yy += 1900;
$mm++;
if ($week != 0) {
if (($yy % 4) == 0) {
$mmax[1] = 29;
if (($yy % 100) == 0) {
$mmax[1] = 28;
if (($yy % 400) == 0) {
$mmax[1] = 29;
}
}
}
$dd -= $week;
if ($dd < 0) {
$mm--;
if ($mm == 0) {
$yy--;
$mm = 12;
}
$dd += $mmax[$mm-1];
}
}
$template->param(YY => $yy);
$template->param(MM => $mm);
$template->param(DD => $dd);
for ($i = 0; $i < $max; $i++) {
my(%row);
$row{'RANK'} = $i+1;
$row{'ITEM'} = qq|<input type="text" name="item$i" size="30">|;
$row{'ITEMURL'} = qq|<input type="text" name="itemurl$i" size="50">|;
$row{'MAKER'} = qq|<input type="text" name="maker$i" size="20">|;
$row{'MAKERURL'} = qq|<input type="text" name="maker$i" size="50">|;
$row{'VALUE'} = qq|<input type="text" name="value$i" size="7">|;
push(@entry_loop, \%row);
}
$template->param(ENTRY_LOOP => \@entry_loop);
$template->param(KEYWORDS => $conf{'keywords'});
$template->param(DESCRIPTION => $conf{'description'});
$template->param(PAGENAME => $conf{'pagename'});
print "Content-Type: text/html\n\n";
print $template->output;
}
sub dispday {
my($rdata) = @_;
my($i, $ymd, @d, @entry_loop, $template);
$template = HTML::Template->new(filename => 'entry.thtml');
if (($in{'yy'} eq '') ||
($in{'mm'} eq '') ||
($in{'dd'} eq '')) {
$template->param(ERROR => '日付が入力されていません。');
}
$ymd = join('/', $in{'yy'}, $in{'mm'}, $in{'dd'});
for ($i = 0; $i <= scalar(@{$rdata})-1; $i++) {
if ($rdata[$i]->{'from'} eq $ymd) {
$d[$rdata[$i]->{'rank'}-1] = $rdata[$i];
}
}
if (scalar(@d) == 0) {
$template->param(ERROR => '指定された日付のデータはありません。');
}
else {
$template->param(YY => $in{'yy'});
$template->param(MM => $in{'mm'});
$template->param(DD => $in{'dd'});
for ($i = 0; $i < $max; $i++) {
my(%row);
$row{'RANK'} = $i+1;
$row{'ITEM'} = qq|<input type="text" name="item$i" size="30" |
. qq|value="|. $d[$i]->{'item'}. qq|">|;
$row{'ITEMURL'} = qq|<input type="text" name="itemurl$i" size="50" |
. qq|value="|. $d[$i]->{'itemurl'}. qq|">|;
$row{'MAKER'} = qq|<input type="text" name="maker$i" size="20" |
. qq|value="|. $d[$i]->{'maker'}. qq|">|;
$row{'MAKERURL'} = qq|<input type="text" name="makerurl$i" size="50" |
. qq|value="|. $d[$i]->{'makerurl'}. qq|">|;
$row{'VALUE'} = qq|<input type="text" name="value$i" size="7" |
. qq|value="|. $d[$i]->{'value'}. qq|">|;
push(@entry_loop, \%row);
}
$template->param(ENTRY_LOOP => \@entry_loop);
}
$template->param(KEYWORDS => $conf{'keywords'});
$template->param(DESCRIPTION => $conf{'description'});
$template->param(PAGENAME => $conf{'pagename'});
print "Content-Type: text/html\n\n";
print $template->output;
}
sub makehtml($) {
my($rdata) = @_;
my($i, %d, $day);
my($yy, $mm, $dd);
my($template, $htmlfile, @fd, @td, @entry_loop);
for ($i = 0; $i <= scalar(@{$rdata})-1; $i++) {
$d{$rdata[$i]->{'from'}}[$rdata[$i]->{'rank'}-1] = $rdata[$i];
}
foreach $day (sort keys %d) {
(@fd) = split(m|/|, $d{$day}[0]->{'from'});
(@td) = split(m|/|, $d{$day}[0]->{'to'});
$htmlfile = $conf{'htmlfile'};
$yy = sprintf("%04d", $fd[0]);
$mm = sprintf("%02d", $fd[1]);
$dd = sprintf("%02d", $fd[2]);
$htmlfile =~ s/%y/$yy/g;
$htmlfile =~ s/%m/$mm/g;
$htmlfile =~ s/%d/$dd/g;
$template = HTML::Template->new(filename => 'ranking.thtml');
$template->param(FROMDAY => sprintf("%4d年%2d月%2d日", @fd));
$template->param(TODAY => sprintf("%4d年%2d月%2d日", @td));
@entry_loop = ();
for ($i = 0; $i < $max; $i++) {
my(%row);
$row{'RANK'} = $i+1;
$row{'ITEM'} = qq|<a target="_blank" |
. qq|href="|. $d{$day}[$i]->{'itemurl'}. qq|"|
. qq|title="|. $d{$day}[$i]->{'item'}. qq|">|
. $d{$day}[$i]->{'item'}
. qq|</a>|;
$row{'MAKER'} = qq|<a target="_blank" |
. qq|href="|. $d{$day}[$i]->{'makerurl'}. qq|"|
. qq|title="|. $d{$day}[$i]->{'maker'}. qq|">|
. $d{$day}[$i]->{'maker'}
. qq|</a>|;
$row{'VALUE'} = $d{$day}[$i]->{'value'};
push(@entry_loop, \%row);
}
$template->param(ENTRY_LOOP => \@entry_loop);
open(HTML, "> $htmlfile") || die("Panic! open error $htmlfile");
print HTML $template->output(). "\n";
close(HTML);
}
}
sub readdatafile($) {
my($rdata) = @_;
my($line);
my($from, $rank, $item, $itemurl, $maker, $makerurl, $value);
if (-f $datafile) {
open(IN, $datafile) || die("Panic! open error $datafile");
while(<IN>) {
chop;
$line = $_;
# どうしても、SJISで保存した場合には、次のコメントを取ってください。
# $line = Jcode->new($line)->euc;
($from, $rank, $item, $itemurl, $maker, $makerurl, $value)
= split(m/,/, $line);
my(%d);
$d{'from'} = $from;
$d{'to'} = &add6day($from);
$d{'rank'} = $rank;
$d{'item'} = $item;
$d{'itemurl'} = $itemurl;
$d{'maker'} = $maker;
$d{'makerurl'} = $makerurl;
$d{'value'} = $value;
push(@{$rdata}, \%d);
}
close(IN);
}
}
sub updatedatafile($) {
my($rdata) = @_;
my($ymd, $i, @work, $line);
$ymd = join('/', $in{'yy'}, $in{'mm'}, $in{'dd'});
for ($i = 0; $i <= scalar(@{$rdata}-1)-1; $i++) {
if ($rdata[$i]->{'from'} ne $ymd) {
push(@work, $rdata[$i]);
}
}
for ($i = 0; $i < $max; $i++) {
my(%d);
$d{'from'} = $ymd;
$d{'rank'} = $i+1;
$d{'item'} = $in{"item$i"};
$d{'itemurl'} = $in{"itemurl$i"};
$d{'maker'} = $in{"maker$i"};
$d{'makerurl'} = $in{"makerurl$i"};
$d{'value'} = $in{"value$i"};
push(@work, \%d);
}
@work = sort sortsub @work;
open(OUT, "> $datafile") || die("Panic! open error $datafile");
for ($i = 0; $i <= scalar(@work)-1; $i++) {
$line = join(',', $work[$i]->{'from'}
, $work[$i]->{'rank'}
, $work[$i]->{'item'}
, $work[$i]->{'itemurl'}
, $work[$i]->{'maker'}
, $work[$i]->{'makerurl'}
, $work[$i]->{'value'});
# どうしても、SJISで保存した場合には、次のコメントを取ってください。
# $line = Jcode->new($line)->sjis;
print OUT $line. "\n";
}
close(OUT);
}
sub sortsub {
$a->{'from'} cmp $b->{'from'} ||
$a->{'rank'} <=> $b->{'rank'};
}
sub add6day($) {
my($day) = @_;
my($y, $m, $d);
my(@max) = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
if (($y % 4) == 0) {
$max[1] = 29;
if (($y % 100) == 0) {
$max[1] = 28;
if (($y % 400) == 0) {
$max[1] = 29;
}
}
}
($y, $m, $d) = split(m|/|, $day);
$d += 6;
if ($max[$m-1] < $d) {
$d -= $max[$m-1];
$m++;
if ($m == 12) {
$m = 0;
$y++;
}
}
$day = join('/', $y, $m, $d);
($day);
}
----- $$$ entry.cgi $$$ -----
----- ^^^ entry.thtml ^^^ -----
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<meta name="keywords" content="<TMPL_VAR NAME="KEYWORDS">">
<meta name="description" content="<TMPL_VAR NAME="DESCRIPTION">">
<title><TMPL_VAR NAME="PAGENAME"></title>
</head>
<body>
<div align="left">
<form action="entry.cgi" method="post">
<font color="#ff0000">
<TMPL_VAR NAME=ERROR>
</font>
<p align="left">
<input type="text" name="yy" size="4" value="<TMPL_VAR NAME=YY>">年
<input type="text" name="mm" size="2" value="<TMPL_VAR NAME=MM>">月
<input type="text" name="dd" size="2" value="<TMPL_VAR NAME=DD>">日
</p>
<table border="1">
<tr>
<th align="center">順位</th>
<th align="center">商品名</th>
<th align="center">商品URL</th>
<th align="center">メーカー</th>
<th align="center">メーカーURL</th>
<th align="center">在庫数</th>
</tr>
<TMPL_LOOP NAME=ENTRY_LOOP>
<tr>
<td align="right"><TMPL_VAR NAME=RANK></td>
<td align="left"><TMPL_VAR NAME=ITEM></td>
<td align="left"><TMPL_VAR NAME=ITEMURL></td>
<td align="left"><TMPL_VAR NAME=MAKER></td>
<td align="left"><TMPL_VAR NAME=MAKERURL></td>
<td align="left"><TMPL_VAR NAME=VALUE></td>
</tr>
</TMPL_LOOP>
</table>
<p align="center">
<input type="submit" value="読込" name="smode">
<input type="submit" value="登録" name="smode">
<input type="submit" value="生成" name="smode">
<input type="submit" value="リロード" name="smode">
</p>
</div>
</form>
</body>
</html>
----- $$$ entry.thtml $$$ -----
----- ^^^ ranking.thtml ^^^ -----
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<meta name="keywords" content="<TMPL_VAR NAME="KEYWORDS">">
<meta name="description" content="<TMPL_VAR NAME="DESCRIPTION">">
<title><TMPL_VAR NAME="PAGENAME"></title>
</head>
<body>
<p align="center">
<TMPL_VAR NAME=FROMDAY>~<TMPL_VAR NAME=TODAY>のランキング
</p>
<div align="center">
<table border="1">
<tr>
<th align="center">順位</th>
<th align="center">商品名</th>
<th align="center">メーカー</th>
<th align="center">在庫数</th>
</tr>
<TMPL_LOOP NAME=ENTRY_LOOP>
<tr>
<td align="right"><TMPL_VAR NAME=RANK></td>
<td align="left"><TMPL_VAR NAME=ITEM></td>
<td align="left"><TMPL_VAR NAME=MAKER></td>
<td align="right"><TMPL_VAR NAME=VALUE></td>
</tr>
</TMPL_LOOP>
</table>
</div>
</body>
</html>
----- $$$ ranking.thtml $$$ -----
以上です。
不明点があれば、分かるまで突っ込んで質問してください。
レスポンスは落ちぎみですが(^_^;;)
度々のお返事ありがとうございます。
ようやく時間を作る事ができ、修正版を使用させて頂きました。
メーカーへのリンクが、在庫数になってしまい、登録時の画面と作成されたhtmlが文字化けしてしまっています。
自分が、csvデータの文字化けを記載した事で、ソースに
# どうしても、SJISで保存した場合には、次のコメントを取ってください。
とあるように、なんらかの処理をして頂いた結果、このようになったのだと思いますので、上に参考資料を色々と掲載して頂けていますので、元ファイルからの改造を行っていきたいと思います。
今まで、cgi関連の事で色々なサイトで質問してきましたが、このように一から作って頂いた事は本当に初めてです
この度は本当にありがとうございました。
これ以上、お手を煩わすのも心許ないので、締め切らせて頂きます。
どうしても、分からない事がありましたら、また質問させて頂きます(^^;
No.4
- 回答日時:
#1 です。
データファイルをCSVとしたい。と言う部分を失念していました。
----- ^^^ entry.cgi ^^^ -----
#!/usr/local/bin/perl
use HTML::Template;
use Jcode;
use CGI;
use strict;
my($max, $datafile);
my($cgi, %in);
my($i, @rdata, %conf);
$max = 10;
$datafile = 'ranking.csv';
$conf{'keywords'} = '';
$conf{'description'} = '';
$conf{'pagename'} = '';
$conf{'htmlfile'} = 'ranking%y%m%d.html';
$cgi = new CGI;
$in{'smode'} = $cgi->param('smode');
$in{'yy'} = $cgi->param('yy');
$in{'mm'} = $cgi->param('mm');
$in{'dd'} = $cgi->param('dd');
for ($i = 0; $i < $max; $i++) {
$in{"item$i"} = $cgi->param("item$i");
$in{"itemurl$i"} = $cgi->param("itemurl$i");
$in{"maker$i"} = $cgi->param("maker$i");
$in{"value$i"} = $cgi->param("value$i");
}
&readdatafile(\@rdata);
if ($in{'smode'} eq '読込') {
&dispday(\@rdata);
}
elsif ($in{'smode'} eq '登録') {
&updatedatafile(\@rdata);
&disp();
}
elsif ($in{'smode'} eq '生成') {
&makehtml(\@rdata);
&disp();
}
else {
&disp();
}
exit(0);
sub disp {
my($i, @entry_loop, $template);
my($yy, $mm, $dd, $week);
my(@mmax) = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$template = HTML::Template->new(filename => 'entry.thtml');
($yy, $mm, $dd, $week) = (localtime(time))[5, 4, 3, 6];
$yy += 1900;
$mm++;
if ($week != 0) {
if (($yy % 4) == 0) {
$mmax[1] = 29;
if (($yy % 100) == 0) {
$mmax[1] = 28;
if (($yy % 400) == 0) {
$mmax[1] = 29;
}
}
}
$dd -= $week;
if ($dd < 0) {
$mm--;
if ($mm == 0) {
$yy--;
$mm = 12;
}
$dd += $mmax[$mm-1];
}
}
$template->param(YY => $yy);
$template->param(MM => $mm);
$template->param(DD => $dd);
for ($i = 0; $i < $max; $i++) {
my(%row);
$row{'RANK'} = $i+1;
$row{'ITEM'} = qq|<input type="text" name="item$i" size="40">|;
$row{'ITEMURL'} = qq|<input type="text" name="itemurl$i" size="80">|;
$row{'MAKER'} = qq|<input type="text" name="maker$i" size="20">|;
$row{'VALUE'} = qq|<input type="text" name="value$i" size="7">|;
push(@entry_loop, \%row);
}
$template->param(ENTRY_LOOP => \@entry_loop);
$template->param(KEYWORDS => $conf{'keywords'});
$template->param(DESCRIPTION => $conf{'description'});
$template->param(PAGENAME => $conf{'pagename'});
print "Content-Type: text/html\n\n";
print $template->output;
}
sub dispday {
my($rdata) = @_;
my($i, $ymd, @d, @entry_loop, $template);
$template = HTML::Template->new(filename => 'entry.thtml');
if (($in{'yy'} eq '') ||
($in{'mm'} eq '') ||
($in{'dd'} eq '')) {
$template->param(ERROR => '日付が入力されていません。');
}
$ymd = join('/', $in{'yy'}, $in{'mm'}, $in{'dd'});
for ($i = 0; $i <= scalar(@{$rdata})-1; $i++) {
if ($rdata[$i]->{'from'} eq $ymd) {
$d[$rdata[$i]->{'rank'}-1] = $rdata[$i];
}
}
if (scalar(@d) == 0) {
$template->param(ERROR => '指定された日付のデータはありません。');
}
else {
$template->param(YY => $in{'yy'});
$template->param(MM => $in{'mm'});
$template->param(DD => $in{'dd'});
for ($i = 0; $i < $max; $i++) {
my(%row);
$row{'RANK'} = $i+1;
$row{'ITEM'} = qq|<input type="text" name="item$i" size="40" |
. qq|value="|. $d[$i]->{'item'}. qq|">|;
$row{'ITEMURL'} = qq|<input type="text" name="itemurl$i" size="80" |
. qq|value="|. $d[$i]->{'itemurl'}. qq|">|;
$row{'MAKER'} = qq|<input type="text" name="maker$i" size="20" |
. qq|value="|. $d[$i]->{'maker'}. qq|">|;
$row{'VALUE'} = qq|<input type="text" name="value$i" size="7" |
. qq|value="|. $d[$i]->{'value'}. qq|">|;
push(@entry_loop, \%row);
}
$template->param(ENTRY_LOOP => \@entry_loop);
}
$template->param(KEYWORDS => $conf{'keywords'});
$template->param(DESCRIPTION => $conf{'description'});
$template->param(PAGENAME => $conf{'pagename'});
print "Content-Type: text/html\n\n";
print $template->output;
}
sub makehtml($) {
my($rdata) = @_;
my($i, %d, $day);
my($yy, $mm, $dd);
my($template, $htmlfile, @fd, @td, @entry_loop);
for ($i = 0; $i <= scalar(@{$rdata})-1; $i++) {
$d{$rdata[$i]->{'from'}}[$rdata[$i]->{'rank'}-1] = $rdata[$i];
}
foreach $day (sort keys %d) {
(@fd) = split(m|/|, $d{$day}[0]->{'from'});
(@td) = split(m|/|, $d{$day}[0]->{'to'});
$htmlfile = $conf{'htmlfile'};
$yy = sprintf("%04d", $fd[0]);
$mm = sprintf("%02d", $fd[1]);
$dd = sprintf("%02d", $fd[2]);
$htmlfile =~ s/%y/$yy/g;
$htmlfile =~ s/%m/$mm/g;
$htmlfile =~ s/%d/$dd/g;
$template = HTML::Template->new(filename => 'ranking.thtml');
$template->param(FROMDAY => sprintf("%4d年%2d月%2d日", @fd));
$template->param(TODAY => sprintf("%4d年%2d月%2d日", @td));
@entry_loop = ();
for ($i = 0; $i < $max; $i++) {
my(%row);
$row{'RANK'} = $i+1;
$row{'ITEM'} = qq|<a target="_blank" |
. qq|href="|. $d{$day}[$i]->{'itemurl'}. qq|"|
. qq|title="|. $d{$day}[$i]->{'item'}. qq|">|
. $d{$day}[$i]->{'item'}
. qq|</a>|;
$row{'MAKER'} = $d{$day}[$i]->{'maker'};
$row{'VALUE'} = $d{$day}[$i]->{'value'};
push(@entry_loop, \%row);
}
$template->param(ENTRY_LOOP => \@entry_loop);
open(HTML, "> $htmlfile") || die("Panic! open error $htmlfile");
print HTML $template->output(). "\n";
close(HTML);
}
}
sub readdatafile($) {
my($rdata) = @_;
my($from, $rank, $item, $itemurl, $maker, $value);
if (-f $datafile) {
open(IN, $datafile) || die("Panic! open error $datafile");
while(<IN>) {
chop;
($from, $rank, $item, $itemurl, $maker, $value) = split(m/,/);
my(%d);
$d{'from'} = $from;
$d{'to'} = &add7day($from);
$d{'rank'} = $rank;
$d{'item'} = $item;
$d{'itemurl'} = $itemurl;
$d{'maker'} = $maker;
$d{'value'} = $value;
push(@{$rdata}, \%d);
}
close(IN);
}
}
sub updatedatafile($) {
my($rdata) = @_;
my($ymd, $i, @work, $line);
$ymd = join('/', $in{'yy'}, $in{'mm'}, $in{'dd'});
for ($i = 0; $i <= scalar(@{$rdata}-1)-1; $i++) {
if ($rdata[$i]->{'from'} ne $ymd) {
push(@work, $rdata[$i]);
}
}
for ($i = 0; $i < $max; $i++) {
my(%d);
$d{'from'} = $ymd;
$d{'rank'} = $i+1;
$d{'item'} = $in{"item$i"};
$d{'itemurl'} = $in{"itemurl$i"};
$d{'maker'} = $in{"maker$i"};
$d{'value'} = $in{"value$i"};
push(@work, \%d);
}
@work = sort sortsub @work;
open(OUT, "> $datafile") || die("Panic! open error $datafile");
for ($i = 0; $i <= scalar(@work)-1; $i++) {
$line = join(',', $work[$i]->{'from'}
, $work[$i]->{'rank'}
, $work[$i]->{'item'}
, $work[$i]->{'itemurl'}
, $work[$i]->{'maker'}
, $work[$i]->{'value'});
print OUT $line. "\n";
}
close(OUT);
}
sub sortsub {
$a->{'from'} cmp $b->{'from'} ||
$a->{'rank'} <=> $b->{'rank'};
}
sub add7day($) {
my($day) = @_;
my($y, $m, $d);
my(@max) = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
if (($y % 4) == 0) {
$max[1] = 29;
if (($y % 100) == 0) {
$max[1] = 28;
if (($y % 400) == 0) {
$max[1] = 29;
}
}
}
($y, $m, $d) = split(m|/|, $day);
$d += 7;
if ($max[$m-1] < $d) {
$d -= $max[$m-1];
$m++;
if ($m == 12) {
$m = 0;
$y++;
}
}
$day = join('/', $y, $m, $d);
($day);
}
----- $$$ entry.cgi $$$ -----
なんとか本日、HTML::Templateモジュールのインストールも無事完了し、再度接続を試みた所今度はJcode.pmがないというエラーに…
こちらも、色々なサイトを参考にし無事にインストールが完了し、希望通りの動きを体感する事ができました!!
ただ、商品名へのリンクはできたのですが、メーカーサイトへのリンクができていなかったので、これから少し手を入れていきたいと思うのですが少し不安です…
保存されたcsvを見てみたら、日本語が文字化けしてしまっています…
メーカー名へのリンクと共に、文字化けの対策をこれから手をつけていきたいと思うのですが、今まで項目を減らしたり、デザインをいじった程度しかperlの知識がない為、不安です…
この2点が解消されるまでこのスレを締め切りませんので、Dpop様以外でもアドバイス頂けたら幸いです
それ以外は完璧です!
希望通りの機能が備わっています!!
本当にありがとうございました!
以下、忘れない為ともしも私と同じくJcode.pmやHTML::Templateモジュールのインストールに困った方の為にも覚え書きとして手順を書いておきます。
Jcode.pmインストール方法
http://openlab.ring.gr.jp/
Jcode-* の「*」は任意のバージョン番号
# gunzip Jcode-*.tar.gz | tar xf -
# tar -xvf Jcode-*.tar
# cd Jcode-*
# perl Makefile.PL; make; make install
HTML::Templateモジュールのインストール
http://search.cpan.org/~samtregar/HTML-Template- …
# gzip -dc HTML-Template-2.7.tar.gz | tar xof -
# cd HTML-Template-2.7
# perl Makefile.PL
# make
# make test
# make install
No.2
- 回答日時:
やりたいことが見えて来ました。
確認を含めて、もう少し詳しく聞かせてください。
やりたいこと
・週単位の売り上げベスト10を表示したい。
・CGIを利用して、データの入力と表示を行いたい。
・データ項目は、商品名、価格、メーカー、在庫数、商品へのURL
・順位付けはプログラムで行うのではなく、データ入力画面から指定できれば良い。
・入力されたデータは、CSVで保存され、表示時にそのCSVファイルを参照して表示する様にしたい。
なんて感じでしょうか?上記で良いと考えて。
・入力画面は、CGIで簡単に作れます。
・表示部分は、CGIで作成する方法と、固定HTMLを出力する方法(CMSの様な感覚。)があります。
・前週との差については、商品をコード管理しないとスムーズにはできません。
・過去週のランキング表示については、ランキング表示をCGIで行うのであれば、容易にできます。固定HTMLであれば、ファイル名規則やリンク機能を考える必要があるので、やや面倒です。
・表示をCGIで行う場合、そのページ全体が1つのCGIとなります。他のHTMLに組み込んで表示する。と言う事はできません。
こんな条件が伴うと思います。
入力画面部分は直ぐにできますが、表示部分についてはご希望によって変わると思います。
ちなみに、データの持ち方は、
週の初めの日付,順位,商品名,商品へのURL,価格,メーカー,在庫数
などと持って挙げれば良いでしょうね。このCSVファイルを手作業で作成して、表示部分だけをCGIで行う。と言う手もありますが。(週の終わりは、単に+7して日付を正規化するだけで問題無いでしょう。)
本当は、メーカーや商品をコード化して、別データで持ち、URL情報などはCGI側でリンクした方が効率良いのですが、コード化する作業が大変かな。
とりあえず、入力部分のサンプルだけでも作成して公開しましょうか?
この回答への補足
度々のお返事ありがとうございます。
表示に関して、cgiで読み込んで表示でもhtmlに書き出して表示という形のいずれでも、特にこだわっておりませんが、サーバーへの負荷を考えると、htmlへの出力がいいのだろうとは感じています。
ただ、サーバーへの負荷が気になる程アクセスもないのが実情ですので…(トップページへ500PV/日)
No.1
- 回答日時:
Web屋です。
質問の意図が今ひとつ理解できませんでした。
・どの様なデータが入力される事を想定しているのか。(リンク情報も含めて。)
・どの様に表示されるのか。(特に、ABCDの各項目の優先順位絡み。)
を明確にして頂けないと、プログラムになりません。
入力データの持ち方と表示方法が分かれば作るのは簡単でしょう。
過去情報については、入力データに日付を持たせて、同じロジックで順位を計算されるだけで良いと思います。
(前回との対比をイメージされているのであれば、もう少し複雑なロジックが必要になるとは思いますが。)
この回答への補足
お返事ありがとうございます。
補足させていただきます。
まず、この質問をさせていただいたのは、このランキングの使用目的として、当店の店頭で販売される商品のランキングをWeb上に公開したいのです。
今まで月間で公開していたのですが、週間に変更しようと思い、少しでも手間を省きたいと思い、Web上で作成管理したいと思っています。
何年何月何日~何年の何月何日 を入力し、1位の入力欄、2位の入力欄・・・ というように、各順位の入力欄があり、そこに商品名と、価格、メーカー、在庫数、販売開始日等の項目を入力したいのです。
2項目だけリンクしたいのが、商品名とメーカーです。
メーカーサイトと、商品詳細ページ(これは別で作成済みのぺーじです)です。
必要最低限なのが、商品名、価格、メーカー、在庫数 の4項目です。
前回とのランク上下に関しても、数値による計算は特に必要ありません。
前回とのランク上下の表示も、「できれば」欲しい機能ではありますが、必要というわけではありません。
これに関しても、手動のプルダウンメニューで「上」「下」「継続」「新規」という項目を選択し、そのまま表示されてもいいのですが、あらかじめセットしていた画像で表示されればベストです。
データの保存はcsvがベストです
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- SQL Server ACCESSで複数テーブルを結合して、リストを作る方法を教えてください。 2 2022/08/12 19:32
- JavaScript 指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードを教えてください 2 2023/04/27 17:58
- その他(データベース) カラム上の重複を削除するクエリを教えてください 3 2022/04/12 14:11
- Visual Basic(VBA) 【VBA】特定の文字で改行(次の行)に行きたい。 3 2022/04/11 17:20
- Excel(エクセル) エクセルについて教えてください。 2 2023/06/14 11:11
- CGI 古ーくからフリーのtree.cgi掲示板を利用させてもらって来ましたが、最新でなにか復活できないか? 2 2023/04/07 10:43
- その他(IT・Webサービス) google サイトの目次表示について 1 2023/06/17 23:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
python subprocessに関する質問
-
別formのhidden項目を自form値...
-
チェックボックスで選択した内...
-
チェックボックスでのvalue値の...
-
心理テストページをCGIで作りた...
-
プルダウン&キーワードで
-
チェックボックスの返す値
-
wordの数式について 定積分を書...
-
ラジオボタンが両方とも選択で...
-
INPUT TYPE
-
ローカルテストサーバーと本番...
-
左右のフレームを同時にスクロ...
-
裏掲示板の見方
-
perlで書いたcgiでsqliteの使い...
-
「value」に2つの値をセットす...
-
perl/cgi リダイレクトができない
-
チェックボックスグループの一...
-
誕生日のカウントダウン日数を...
-
リストボックス(multipleなsel...
-
FORMのselectの選択肢を最初か...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
チェックボックスの返す値
-
別formのhidden項目を自form値...
-
チェックボックスで選択した内...
-
Error: No Recipient というエ...
-
hiddenで送ったデータの取り出し方
-
CGIでチェックボックスを使...
-
チェックボックスでのvalue値の...
-
アンケートフォームで前のペー...
-
python subprocessに関する質問
-
CGIで得た内容をHTMlページに代入
-
CGI→CGI変数の引き継ぎは...
-
複数ボタンのvalueを送れない
-
CGIフォームから飛ばすメールで...
-
FC2 掲示版のカスタマイズの仕...
-
1つのformに2つのsubmitボタン
-
心理テストページをCGIで作りた...
-
”送信ボタン” ”クリアボタン”...
-
フォームの入力内容の後ろに文...
-
アンケートで質問を複数ページ...
-
アンケートの質問を複数にしたい
おすすめ情報