cgiでログの内容を追加、変更する方法

このQ&Aのポイント
  • 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); } と、こんな感じでかなり強引だなと思いつつチャレンジしてみたものの 思ったとおりうまく動いてくれませんでした。 長くなりましたがどうか、よろしくおねがいします。。

  • wm_bf
  • お礼率84% (22/26)
  • CGI
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • trisagion
  • ベストアンサー率68% (15/22)
回答No.1

一旦ログファイルの中身を配列に読み込み、配列内のデータを変換後ログファイルに上書きで書き出す形にしてはどうでしょうか。 open(LOG,"log.txt"); @log = <IN>; close LOG; foreach $log(@log){  @data = split(/,/,$log);  if($data[0] eq $number){   $log = "$number,$name,$mail,$coment\n";  } } open(LOG,">log.txt"); foreach $log(@log){  print LOG $log; } ※ファイルロックらーチェック等省略

wm_bf
質問者

お礼

ありがとうございます。 何とか下記の方法で解決することが出来ました。 open IN,"nx_log.txt"; while(<IN>){ $data = $_; chop $data; ($fnum)=(split(/\,/,$data))[0]; if($fnum eq $number){ $data = join(',',$number,$name,$mail,$coment); } push @alldata,$data; } close IN; open OUT,'>log.txt'; foreach (@alldata){ print OUT $_,"\n"; } close OUT;

関連するQ&A

  • Perl言語でファイル入出力プログラムについて

    Perlでファイル入出力のプログラムをコーディングしたいのですが、いまいちハッシュが理解しずらく困っています。わかる方よろしくお願いします。 moto.pl の中にあらかじめ AAA aaa AaAa AAaa BBB bbb BbBb BBbb CCC ccc CcCc CCcc AAA aaa AaAa AAaa .... というように一行ずつ文字列があり、この場合では最初の大文字AAAが二つあるので、その結果を例えばsaki.plに AAA 2 ... というように出力するプログラムを教えて頂けませんか?

    • ベストアンサー
    • Perl
  • 重複レコードの抽出について

    以下のようなテーブルからmailが重複していてnameの値が全て同じ値を持つレコードを取得するためのSQL文を教えてください。 mail | name ----------- aaa | 01 aaa | 01 aaa | 01 bbb | 02 bbb | 02 bbb | 01 ccc | 01 ccc | 01 ccc | 02 select * from test where mail in (select mail from test where mail group by mail having count(mail)>1) 上記のSQL文だと以下のデータが取得されてしまいます。 ↓ mail | name ----------- aaa | 01 ○ aaa | 01 ○ aaa | 01 ○ bbb | 02 × bbb | 02 × ccc | 01 × ccc | 01 × ○印のみ取得したいのですが、 SQL文をどのように修正すればよいのでしょうか。 よろしくお願いいたします。

  • File::Tailでファイル名変更に追従するには

     あるログファイルをリアルタイムにトレースして流量を測る ツールを作ろうとしています。  mailstats.plを参考にいろいろと試しているのですが、監視 しようとしているログが日付つきのファイル名で作られていて 日次でファイル名が変わってしまうのです。  File::Tailはデフォルトだとdieしてしまいますが、errmode でハンドラを試してみたり、name_changesを試してみたり していますがうまくいきません。  ログをはいているプロセスに、ファイル名が変わるタイミン グで何かをキックしてもらうか、とも考えたのですがあまりス マートではないような気がしています。  良い方法はあるでしょうか。詳しい方教えてください。  よろしくお願いいたします。  以下errmode,name_changes等を試す前のスクリプトです。 === #!/usr/bin/perl use File::Tail ; $debug = 0; $mail_log = './log' ; my $logref=tie(*LOG,"File::Tail",(name=>$mail_log,debug=>$debug)); while (<LOG>) { print; } ; ===  ファイルがmvされると、 Error opening ./log: No such file or directory at ./tail.pl line xx  となります。  このエラーをフックして、再オープンできれば良いのですが。。

  • フォームの内容を確認するページをはさむ方法

    htmlのフォームに記入してもらった内容を、そのままデータに書き込むcgiに送信するのではなく、一回内容を表示した確認cgiをはさみたいのですが、どうすればよいのでしょうか。 とりあえず、今の状態は、htmlファイルから読み込むデータを"name","mail","coment"の3つとしてます。 enquete.htmlファイルの一部: <FORM method="POST" action="enquete.cgi"> <TABLE> <TR> <TD>名前</TD> <TD><INPUT type="text" name="name"></TD> <TD>メールアドレス</TD> <TD><INPUT type="text" name="mail"></TD> <TD>コメント</TD> <TD><INPUT type="text" name="coment"></TD> </TR> <INPUT type="submit" value=" 送 る ">    <INPUT type="reset" value="やり直す"> のような感じです。 これに確認cgiをはさんで、 enquete.html"確認ページへ" →kakunin.cgi"送る" →enquete.cgi"戻る" みたいな構成にしたいのですが、kakunin.cgiの実装の仕方を教えてください。また、それにともない、直す箇所も教えてください。 おねがいします。

    • ベストアンサー
    • CGI
  • phpでのメールフォームの作成について

    HTMLで <form action="mail.php" method="post"> <input name="aaa" type="checkbox" id="aaa" value="AAA" checked> <input name="bbb" type="checkbox" id="bbb" value="BBB" checked> <input name="ccc" type="checkbox" id="ccc" value="CCC" checked> </form> として、次に進むボタンを押すとmail.phpに飛び mail.phpでは、チェックされたものだけを表示したいのですが、どうすればよいでしょうか? もし、AAAとBBBが選ばれたら あなたが選んだのは AAA、BBBです。 と表示したいです。そのあとにメールフォームを続けるつもりです。 ご教授よろしくお願いします。

    • 締切済み
    • PHP
  • 任意の行を修正し、ファイルを上書きしたいのですが…

    <html> <head> <title>修正・変更</title> </head> <body> <?php  $aaa = $_POST['aaa'];  $bbb = $_POST['bbb'];  $ccc = $_POST['ccc'];  $dummy = $_POST['hidden'];  $lines = array($aaa, $bbb, $ccc,$dummy);  $lines = implode(",", $lines);  $lines = mb_convert_encoding($lines, "SHIFT-JIS" , "EUC-JP");  $file = file('sample.csv');  $file[$i] = $lines."\n";  $fp = fopen("sample.csv","w+");  for($i=0 ; $i<count($file) ; $i++) {   flock($fp, LOCK_EX);   fwrite($fp, $file[$i]);  }  fclose($fp); ?> <div align="center"> 修正・変更しました!! <br><br> <input type="button" name="button" value="戻る" onClick="location.href='aaa.php'"> </div> </body> </html> 上記の様なプログラムを「CSVファイルを書き込む方法」を基に書いて みました。 しかしながら、どうしても任意の行のデータを修正して上書きする ことができません(涙 どうやったら任意の行のデータかどうかを認識して、上書きする事が できるのでしょうか?? 皆様お忙しい中かとは思いますが、ご教授して頂けませんでしょうか。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • if 文についての質問です。

    下記ようなプログラムで、HTML 上のフィールド (AAA)が(100) で (BBB)が(200) の場合 (300) を (変数の$answer) に格納し、実行結果を Sendmail で送信する為、新しく生成された HTML 上のフィールド (CCC) に表示したいのですが、どこが間違っているのでしょうか?お手数ですがどなたか記述上、間違っている箇所をお教え頂けると有難いです。 ---------------------------------------------------------------- #!/usr/local/bin/perl #!/usr/local/bin/perl require "cgi-lib.pl"; &ReadParse(); print "Content-type: text/html\n\n"; print <<HTML_DOCUMENT; if ($in{'AAA'} eq "100" and $in{'BBB'} eq "200") { $answer = '300'; } <html> <head> <title>Web Design [ Estimate - Order ]</title> </head> <body> <form action="test_sendmail.cgi" method="post"> <input name="AAA" type="checkbox" id="AAA" value="100"> <input name="BBB" type="checkbox" id="BBB" value="200"> <input name="CCC" type="text" id="CCC" value="$answer" size="10"> </form> </body> </html> HTML_DOCUMENT

  • sedコマンドを使用して、文字の置換を行いのですが助けてください。

    sedコマンドを使用して、文字の置換を行いのですが助けてください。 sedコマンドやawkコマンドなどを使って、aliasesファイルの置換を行いたいのですが、 うまくいかないので教えていただけないでしょうか? 知りたいのは、次のような置換を一括で行うことのできるコマンドです。 ■置換前のファイル ================= AAAA:  :include:/file/name BBBB:  :include:/file/name CCCC:  :include:/file/name ================= ■置換後のファイル(希望する置換結果) ※1フィールド目の任意の文字列をメールアドレスのローカルパートとして利用したい ================= AAAA:  AAAA@example.com BBBB:  BBBB@example.com CCCC:  CCCC@example.com ================= 以上です。

  • メールの送信先を追加する方法について

    ある会社にホームページを作ってもらったのですが、今回から私がホームページを更新していかなければいけなくなってしまいました。 ある程度知識はつけたつもりなのですが、わからない事があったので質問させていただきました。 当社のホームページは商品申し込みページからメールを送れるようになっています。 今は、お客様が弊社にメールを送るとホームページ開設時に作ったAAA@xxx.jpに送られますが、お客様が弊社にメールを送るとAAA@xxx.jp(最初からある弊社のメールアドレス)とBBB@xxx.jp(新しく追加したいメールアドレス)に送信することはできるのでしょうか。 <form>タグの部分を見るとCGIを使っているようなのですが・・・。 ----------------------------- <form method="POST" action="/cgi-bin/powermail.pl"> <input type="hidden" name="check_blank" value="name,postal_code,address,tel,e-mail"> <input type="hidden" name="check_mail_fmt" value="e-mail"> <input type="hidden" name="set_reply_to" value="e-mail"> <input type="hidden" name="set_from_address" value="AAA@yahoo.jp"> <input type="hidden" name="set_to_address" value="AAA@yahoo.jp"> <input type="hidden" name="set_subject" value="***[ order ]***"> -------------------------------------- と記述されているのですが、<input type="hidden" name="set_to_address" value="AAA@yahoo.jp">と<input type="hidden" name="set_from_address" value="AAA@yahoo.jp">を変更してしまえば送信先アドレスが変更できると思うのですが、お客様からのメールを同時に2箇所のあて先に送信するにはどういった方法があるのでしょうか。 それにあて先の変更ではなくて、「追加」する場合となるとcgi自体のスクリプトを弄らなければいけないのではないでしょうか。 大変困っています。どなたかご助言をいただければ幸いでございます。 どうぞよろしくおねがいします。

    • ベストアンサー
    • CGI
  • メタ文字の取り扱い

    カレントディレクトリにディレクトリaaa, bbb, cccが在り、さらにそれぞれのディレクトリに11_2とか9_20などのような1から20までの数字を_で2個つなげたディレクトリが在ります。そのディレクトリの中のファイル名を出力する以下のスクリプトgetname.plを作成したのですが、 Unrecognized escape \d passed through at ./getname.pl line 9. Unrecognized escape \d passed through at ./getname.pl line 9. というエラーが出ます。全く原因がわからないでいます。もしよろしければ解決法をご教示いただけないでしょうか。どうぞよろしくお願いします。 #!/usr/bin/perl use strict; use warnings; my @directory=qw/aaa bbb ccc/; foreach my $dname (@directory) { opendir(DIR,"./$dname/\d+_\d+"); my @dir=readdir(DIR); close(DIR); print join("\n",@dir); } print "\n";

    • ベストアンサー
    • Perl

専門家に質問してみよう