アプリ版:「スタンプのみでお礼する」機能のリリースについて

CGIを作成していてforeach文のところを通ってくれません。原因が不明なのですが下記でおかしいことなどがあったらおしえてください。
お願いします。
$entrycgi = "./touhyou.cgi";
$Location = '../images';
$imgVote = $Location."/click.gif";
$votefile = "./database/vtbl.dat";


sub vote_form{
print "<FORM ACTION=\"$entrycgi\" METHOD=\"post\" NAME=\"Form\">\n";
print "<INPUT TYPE=\"hidden\" NAME=\"proc\" VALUE='entry'>\n";
print "<INPUT TYPE=\"hidden\" NAME=\"Action\">\n";

print "<TABLE><TR><TD><IMG SRC=\"$Location."/top.gif\"></TD></TR></TABLE>\n";
open(FILE, "+<$votefile");

@output = <FILE>;

close(FILE);

print "<TABLE><TR>\n";

$i = 1;
@output_sort = sort { $b <=> $a } @output;
foreach $output_sort(@output_sort){
($COUNT, $NM, $FILENM, $NO) = split(/\,/, $output_sort);
$filename = $Location.$FILENM;
print "<IMG SRC='$filename' HEIGHT=100 WIDTH=100></TD>\n";
if ($i == 5) {
last;
} else {
print "<TD width=\"50\"></TD>\n";
$i++;
}
}
print "</TR></TABLE>\n";

}

A 回答 (4件)

> Permission denied



これは、そのファイルに対するアクセス権限がない、というエラーです。

> $votefileの属性は755

755 ということは、そのファイルの所有者以外は書き込みができない、という事です。

たいていのサーバではセキュリティなどの問題から、CGIの実行ユーザは nobody などになっていたりするので、$votefile を第三者権限で操作することになるわけです。
つまり、$votefile に対しては書き込みができない、という事です。

しかし、

> open(FILE, "+<$votefile");

では、+< によって書き込みもできるものとしてオープンしようとしていますから、ファイルを開かせてもらえず、open が失敗するのです。

ぱっと見では書込み操作はしていませんから、+< ではなく < とすれば良さそうです。
もし書き込みもする予定なら、$votefile のパーミッションを 777 にしてください。
    • good
    • 0
この回答へのお礼

こんにちは。
ありがとうございます。

パーミッションを777にしたらできました!!
書き込みの操作はしていないので<<と変えてみたのですがそれはむりでした。

でも助かりました。ありがとうございました。

お礼日時:2004/03/11 11:50

perlはそんなに詳しくないのではずしてるかもしれませんが、



print "<TABLE><TR><TD><IMG SRC=\"$Location."/top.gif\"></TD></TR></TABLE>\n";

この行「"」の対応がおかしくないですか?

この回答への補足

ありがとうございます。
確かにそうですね。
でもこれはすでに修正ずみでしたがやはり<FILE>の読み込みがされていないようでした。

補足日時:2004/03/10 23:25
    • good
    • 0

> foreach文のところを通ってくれません。



foreach の中が実行されていないことを、どのように確認しましたか?
よくあるのは、ファイルパスの間違いにより、ファイルが読まれていないことです。
open の部分を
  if (! open(FILE, "+<$votefile")) { print $! }
  else {
    @output = <FILE>;
    close(FILE);
  }
とし、確認してみてください。

この回答への補足

ありがとうございます。
教えていただいたように書いて試してみたのですが
Permission denied
というようなエラーがでました。
これはどういったことなのでしょうか?
$votefileの属性は755、$entrycgiは777です。
よろしくお願いします。

補足日時:2004/03/10 23:11
    • good
    • 0

ソースコードをみれば判りますので余計なお世話かもしれませんが、CGIにはC言語で書かれたものもありますので、この場合「perl」と書くべきですね。



>print "<FORM ACTION=\"$entrycgi\" METHOD=\"post\"
「entrycgi」となっていますが「entry.cgi」ではないですか?

>@output_sort = sort { $b <=> $a } @output;
どのようなデータが入っているのかが判らないのでなんともいえませんが、この行が問題なのではと思います。

後、「@output_sort」の要素を指定する「$output_sort[0]」や、最後の要素を指定する「$#output_sort」と間違え易いので、「$output_sort」のような、配列と同じ名前のスカラー型変数はなるべくやめたほうがいいです。

この回答への補足

ありがとうございます。
>>print "<FORM ACTION=\"$entrycgi\" >METHOD=\"post\"
「entrycgi」となっていますが「entry.cgi」ではないですか?

$entrycgiのは『entry.cgi』が代入されているため問題はないと思います。

@output(gsvottbl.dat)には
0,aaa,/file01.jpg,01
0,bbb,/file02.jpg,02
0,ccc,/file03.jpg,03
0,ddd,/file04.jpg,04
0,eee,/file05.jpg,05
が入っています。

よろしくお願いします。

補足日時:2004/03/10 18:43
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!