メッセージが上に追加される掲示板

このQ&Aのポイント
  • Perl超初心者のための、メッセージが上に追加される掲示板についての質問です。
  • 現在、掲示板を作成しようとしているが、CGIを使える無料のサーバーでパーミッションの設定に問題が発生している。
  • リネームを使わずにメッセージを上に追加していくスクリプトを作成する方法を知りたい。
回答を見る
  • ベストアンサー

メッセージが上に追加される掲示板

Perl超初心者ですが、お願いいたします。 掲示板(本当は、友人の原稿をホームページに自分で載せてもらうスクリプト)を、だいたい以下のように組んでみました。 require "cgi-lib.pl"; require "jcode.pl"; $naiyou = $in{"naiyou"}; &ReadParse;&jcode'convert(*naiyou,"euc"); $datafile="data.txt"; $tempfile="hokan"; open (TEMP,">$tempfile"); print TEMP "<font size=\"2\">$naiyou</font>"; open(DATA,"$datafile"); while (<DATA>) { print TEMP $_; } close(DATA) ; close(TEMP) ; rename($tempfile,$datafile); ところが、ローカルでは動いたものの、私が借りた、CGIを使える無料のサーバーでは、パーミッションを777に設定できません。(詳しい説明がないのですが、他のユーザーに書き込み権限を与える設定はどれも駄目そうです) そこで、リネームを使わないで、上に追加していくスクリプトを作れないものでしょうか。無理ですか? サンプルがあるホームページなどを紹介していただけるとうれしいです。

  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#9414
noname#9414
回答No.1

open (TXT,"$datafile"); @lines = <TXT>; close(TXT); unshift(@lines, "$naiyou\n"); seek(TXT, 0, 0); open(DATA,">$datafile"); print DATA @lines truncate(DATA, tell(DATA)); close(DATA) ; でできたはず。 だめなときは補足してください。 ではでは☆

supersonic
質問者

お礼

ありがとうございます。できました!  最初、jcode.plを なぜか大文字のファイル名にしたりディレクトリ構造が 違っちゃったりして、直すまで3時間くらいかかりました。(^^;) しかし、ともかく、おかげさまで、一応のものですが 設置できました。 本当にどうもありがとうございました。m(__)m

関連するQ&A

  • mkdirでのファイルロック

    私はCGIの経験がほとんどなく超初心者です。下記のようなファイルを作りましたがファイルのロックをしなければデータが書き込まれないようなので困ってしまっています。flockはつかえないようなのでmkdirでロックをかけたいのです。 #! /usr/local/bin/perl $| = 1; require './jcode.pl'; require './mimew.pl'; require './cgi-lib.pl'; &ReadParse(*FORM); $thisfile = 'mother'; $countfile = './mother.txt'; $predatadir ='./mom'; $fromname = "sabra net"; $fromemail = '***@****.co.jp'; $act = $FORM{'act'}; #### main始動 #### if($act eq "indata"){   &getnumber;   &datamod;   &inputDB;   &mailsend;   &view; } else{   &datamod;   &kakunin; } #### main終了 #### #### メッセージ番号設定 #### sub getnumber {   open(COUNTER,"$countfile") || &error('countfileが開けない');     $this_num = <COUNTER>;   close(COUNTER);     $this_num++;   open(COUNTER,">$countfile") || &error('countfileに書きこめない');     print COUNTER "$this_num";   close(COUNTER);   if( length($this_num) == 1 ){     $this_num ="000000" . $this_num;   }   elsif( length($this_num) == 2 ){     $this_num ="00000" . $this_num;   } } #### datafileへ入力 #### sub inputDB {   $datafile = "$predatadir/userdata01.csv";    open(DB,">>$datafile") || &error('datafileに書きこめない');      print DB "$yourname,$email\n";    close(DB); }

    • 締切済み
    • CGI
  • cgi出力での文字コードについて

    下記のソースをsjisで作っていて、出力するdata.txtをuft-8で保存したいです。 どのようにすればよいでしょうか? 下記ソースでは、data.txtはsjisになっています。 尚、htmlはsjisなのでそのまま使用したいです。 どなたか教えてください。 宜しくお願いします。 ############################# #!/usr/local/bin/perl require 'jcode.pl'; require 'cgi-lib.pl'; &ReadParse; $datafile='data.txt'; ←これの保存のみutf-8にしたい open(FH,">$datafile"); print FH "$in{'name'}"; close(FH); rint "Content-type:text/html\n\n"; print "<meta http-equiv='Content-Type' content='text/html; charset=Shift_JIS'>"; print "<html><head></head><title>テスト</title><body>\n"; print "<center>入力完了しました。</center><hr /><br>\n"; print "<b>名前:</b>$in{'name'}<br>\n"; print "<hr />\n"; print "</body></html>";

    • 締切済み
    • CGI
  • cgiのopenについて

    cgiのopenを使って下記のソースを作りました。 が、読み込んだテキストの一行目しか読み込みませんToT require 'cgi-lib.pl'; &ReadParse(*answer); $data = "$answer{'text'}"; require 'jcode.pl'; &jcode'convert(*data,'sjis'); open(dataright,"<data.txt"); $data= <dataright>; close(dataright); print "Content-type:text/html\n\n"; print <<EOF; <html> <head> <title>メール送信フォーム</title> </head> <body> ------------------<br> お知らせ<br> $data ------------------<br> </body> </html> EOF exit; ちなみにテキストは改行に<br>を入力してあります。 ぜひアドバイスをお願いいたします。

    • ベストアンサー
    • CGI
  • Perl/CGIについて

    #!/usr/bin/perl use CGI; $cgi = new CGI(); $from = $cgi->param('from'); $namae = $cgi->param('namae'); $naiyou = $cgi->param('naiyou'); print "Content-type: text/html\n\n"; # 設定 $sendmail = '/usr/lib/sendmail'; $jcode = './jcode.pl'; $to = 'ha***@***.ne.jp'; #$from = ''; $subject ='名鉄と地下鉄の直通運転'; # 文字コードライブラリの読み込み require $jcode; # メール送信 &jcode'convert(*subject,'jis'); open(MAIL,"| $sendmail -t"); # ヘッダ情報出力 print MAIL "To: $to\n"; print MAIL "From: $from\n"; print MAIL "Subject: $subject\n\n"; # 本文出力 print MAIL " $namae\n\n"; print MAIL " $naiyou\n"; close(MAIL); #確認表示 print " $namae\n"; print " $naiyou\n"; print "メールを送信しました\n"; end #確認表示の所で表示が改行されない。

    • ベストアンサー
    • Perl
  • 要素の上書きについて

    perl初心者です。HTMLのフォームからCGIにデータを送り、そのデータを表示するだけのCGIを作っているのですが、HTMLフォームの中の項目を空のまま送信したときに、CGI側でその表示部分はなくなります。できれば、項目が空の時には、CGIで以前に登録していたデータが上書きされずに表示されるようにしたいのですが、どうしたら良いのかわかりません。どなたかご教授していただけないでしょうか。よろしくお願いいたします。(うまく説明できず、ご迷惑おかけします。) #!/usr/local/bin/perl #データファイル $datafile='./data.dat'; #ライブラリの読み込み require './jcode.pl'; #フォームデータの読み込み if ($ENV{REQUEST_METHOD} eq "POST"){ read (STDIN,$input,$ENV{CONTENT_LENGTH}); }else{ $input=$ENV{QUERY_STRING}; } #フォームデータのデコード $input =~ tr/+/ /; $input =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; #SJISコード変換 &jcode::convert(\$input, 'sjis'); #データのオープン open(DAT,"+< $datafile"); flock(DAT, 2); #データの書き込みとクローズ seek(DAT,0,0); print DAT $input; close(DAT); open(IN,"$datafile"); $input=<IN>; #フォームデータの分解 @form=split (/&/,$input); close(IN); &header; print "<div class=\"iframe_body\">"; #データを表示する(左側) print "<div class=\"iframe_left\">"; $a=$form[0]; $a=~s/名前=/ /; print "<b><font color=\"#ff0000\">$a</font></b>"; print "<br>"; $a=$form[1]; $a=~s/画像=/ /; print "<img src=\"$a\" width=\"120\" height=\"100\" border=\"0\">"; print "<br>"; $a=$form[2]; $a=~s/住所=/ /; print $a; print "<br></div>"; #データを表示する(中央) ・ ・ #データを表示する(右側) ・ ・ print <<EOM; </body> </html> EOM exit; #----------------------------------------------------------------------------------- # HTMLヘッダー #----------------------------------------------------------------------------------- sub header { print "Content-type: text/html\n\n"; print "<link rel=\"stylesheet\" href=\"../iframe.css\" type=\"text/css\">\n"; print <<EOM; <html> <head> <META HTTP-EQUIV="Content-type" CONTENT="text/html";charset=shift_jis> <title></title> </head> <body> EOM }

    • ベストアンサー
    • Perl
  • &jcode'convert(しても文字化けする

    cgiにある日本語文書contents.txtをメール受信すると文字化けします。 解決策を教えてください。 require './jcode.pl'; open(FH, ">contents.txt"); print FH @contents; close(FH); #連結 $contents=""; foreach $key (@contents) { $contents=$contents.$key; } &jcode'convert(*contents,'jis');

    • ベストアンサー
    • CGI
  • Yomi-Search追加機能で・・・

    Yomi-Searchのvr4.22を使っております 某サイトで 新着サイトをトップページにピックアップする CGIがあったので これを使ってます そこで このプログラムをつかって 呼び出されたバナーをクリックして 『新規ウィンドウ』で開きたいのですが なかなかうまくいきません それと トップページにバナーは表示されるのですが バナーの横に・点のような模様がなぜかついてしまいます これを消すにはどうすればよいでしょうか? #!/usr/bin/perl #↑perlのパスを自分の環境に合わせて書き直します。 require 'pl/jcode.pl'; require 'pl/cfg.cgi'; print "Content-type: text/plain\n\n"; print "<!--\n"; print "document.write(\"<ul>\")\;\n"; $newlog_count = 0; open(IN,"$EST{log_path}new_ys.cgi"); while(<IN>){ if (5 < $newlog_count) { last; } # ログ切り出し。 @Slog=split(/<>/,$_); # サイトのURL. $jump_url=$Slog[2]; # ランキングポイントに加える場合、以下のコメントを取る。 # $jump_url=~s/(\W)/'%' . unpack('H2',$1)/eg; # $jump_url="$EST{cgi_path_url}$EST{rank}?mode=link&id=$Slog[0]&url=$jump_url"; # ドキュメントに書き込む。 print "document.write(\"<li><a href=$jump_url><img src=$Slog[12]></li>\")\;\n"; ++$newlog_count; } close(IN); print "document.write(\"</ul>\")\;\n"; print "//-->\n"; exit; ここまでです そしてトップページに貼り付けたすぷりくとは↓ <script language="javascript" src="http://・・・_new.cgi?mode=new&max=10"></script> どうかおちからを貸してください

    • ベストアンサー
    • CGI
  • jcode.plアップロード不要の場合の設定変更

    CGI設置にあたり、設定変更で悩んでいます。 jcode.plがサーバーにプリインストールされているためアップロードは不要で、require 'jcode.pl'; と記載するようにとのことです。 require "./jcode.pl"; となっているものについては問題なかったのですが、 $jcode = './jcode.pl'; 中略 require $jcode; と記述されているものを、どのように書き換えたらよいのか分かりません。 ご教授のほど、どうぞよろしくお願い致します。

    • 締切済み
    • CGI
  • ログの内容を追加、変更をしたいのですが。。。

    cgiで一度登録した内容を後に変更したい場合、 どのようにすればよいのでしょうか? 番号 名前 アドレス コメント 001,aaaa,aaa@aaa,あいうえお 002,bbb,bb@bb, 003,ccc@ccc, 002のコメントに”かきくけこ”追加する 番号 名前 アドレス コメント 001,aaaa,aaa@aaa,あいうえお 002,bbb,bb@bb,かきくけこ 003,ccc@ccc, という感じなのですが。。。 #!/usr/local/bin/perl require 'pl/cgi-lib.pl'; require 'pl/jcode.pl'; #前のページから追加、変更したいデータを読み込む &ReadParse(*file); my $number = $file{'number'}; my $name = $file{'name'}; my $mail = $file{'mail'}; my $coment = $file{'coment'}; if(open (PEFFILE, ">>log1.txt")){ flock(PEFFILE,2); open (PF, "<log.txt") @date = <PF>; close (PF); foreach $date(@date){ ($number1,$name1,$mail1,$coment1)=split(/\,/,$data); if($number1 eq $number){#番号を一致したら新しい情報を書く print PEFFILE "$number,$name,$mail,$coment\n"; }else{#そうでなければそのまま前と同じ情報を書く print PEFFILE "$number1,$name1,$mail1,$coment1\n"; } flock(FP,8); close (PEFFILE); } と、こんな感じでかなり強引だなと思いつつチャレンジしてみたものの 思ったとおりうまく動いてくれませんでした。 長くなりましたがどうか、よろしくおねがいします。。

    • ベストアンサー
    • CGI
  • CGIで二つの仕事をしたい

    464487で質問したOtanoshikeです。 メール送信CGIは_mer_さんに教えて頂いたように直したら、無事動くようになりました。 今度は、このCGIの中で、メール送信後にファイル転送をしようとしています。 一応動いてはいるようなのですが、最後の確認ページが出ません。 どこが悪いのでしょうか?恐らくはまた基本的なことを無視しているのでしょうね。 よろしくお願いいたします。 (a.cgi) #!/usr/bin/perl require '../mimew.pl'; require '../jcode.pl'; $sendmail = "/var/qmail/bin/sendmail"; $master_id = "ho\@hoge.net"; $msg="メッセージ"; &jcode'convert(*msg,'jis'); open (ML,"| $sendmail $master_id"); print ML $msg; close(ML); $filename=$ARGV[0]; $file="/~/~/$filename"; $filetype='x-exe'; print "Content-Disposition:attachment;filename=\"$filename\"\n"; print "Content-type:application/$filetype\n\n"; open(FILE,"$file"); while(<FILE>){ print "$_"; } close FILE; print "Content-type: text/html\n\n"; print "<html><head>\n"; print "</head>\n"; print "<body>sent.\n"; print "</body></html>\n"; exit;

    • ベストアンサー
    • CGI