• 締切済み

フォームデータの処理について

フォームで入力された FORM{'deny'} = アホ バカ http ←半角空白で区切り というデータを受け取ったら、それをdeny.cgiへ @deny=('アホ','バカ','http'); という形で記録したいとおもっています。 そこで、 $setfile = "./deny.cgi"; open(IN,"$setfile") || &error("システムエラー","ファイル「$setfile」を開くことができません。"); @data = <IN>; close(IN); $maxdate = 1; if ($maxdate ne "") { while ($maxdate <= @data) { pop(@data); } } unshift (@data,\@deny=\('$FORM{'deny'}';\n"); と書いてみたものの、これでは deny.cgiに@deny=('アホ バカ http'); と記録されてしまいます。 そこで@deny =join('\',\'',$FORM{'deny'});を追加記述してみたのdすが まったくうまくいきません。 どうしたら良いのかご教授ください。 どうかよろしくお願いいたします。

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

みんなの回答

  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.1

なんだか質問で提示されたコードにtypoが多くて 回答にも自信が持てませんが @deny = qw(アホ バカ http); このようにdeny.cgiに書き込むほうが楽そう。 unshift ( @data , '@deny = qw('. $FORM{'deny'} .');' ); で、どうでしょう。 qwについては http://pub.ne.jp/wakapon/?entry_id=440238 こちらを参考に。

masa-25
質問者

お礼

本当はポイントを付与させていただきたかったのですが、 操作ミスで付与し忘れてしまいました。 せっかく親切にお教えくださったのに 大変申し訳ございません。お許しください。

masa-25
質問者

補足

回答どうもありがとうございます。 今、早速やってみたところ、うまく稼働しました。 ご親切にお教えくださり、どうもありがとうございます。

関連するQ&A

  • 配列のデータから改行だけを取り除いて上書きしたい

    いつもお世話になっています。 CGIで現在下記のようなファイルがあります。 【sample.cgi】 1<>2<>3<>4<>5<> 6<>7<> これを下記のスクリプトで呼び出し配列に入れます。open(IN,"./sample.cgi"); @DATA = <IN>; close(IN); @data = split(/<>/,$DATA[0]); @N_DATA=(); unshift(@N_DATA,"$data[1]<>$data[2]<>$data[3]<>$data[4]<>$data[5]<>$data[6]<>$data[7]<>"); open(OUT,">./sample.cgi") or &error('書き込み失敗'); print OUT @N_DATA; close(OUT); しかし実行結果は改行が残ったままで、どうにか 1<>2<>3<>4<>5<>6<>7<> という形で出力したいのですがどのように変更を行えば宜しいでしょうか。 恐らく「unshift」の部分が行を追加していっていると思うのですが、printなどで出力するとsample.cgiの中身が空になってしまい・・・。 「読み込むデータに改行があった場合は改行を削除して読み込む」という動作をさせたいのですが・・・。 何卒よろしくお願い致します。

    • ベストアンサー
    • CGI
  • アンケートフォームの設定について

    質問が1-1、1-2、1-3とあるのですが、その1-1質問中で「はい」と答えた方のみ1-2へ、更に1-2でも「はい」と答えた方が1-3まで回答いただく設定にし、1-1で「いいえ」と答えれば、次の1-2以降は答えなくても良いようにするにはどのようにすればよいのでしょうか?※csvデータ「いいえ」の回答の際は1-1 いいえ、1-2、1-3はブランクとなるような設定が理想ですが。 省略 # form.htmlよりデータを変数に代入 $d[0]=$in{'name'}; $d[1]=$in{'sex'}; $d[2]=$in{'age'}; $d[3]=$in{'q1-1'}; $d[4]=$in{'q1-2'}; $d[5]=$in{'q1-3'}; $d[6]=$in{'q2-1'}; $d[7]=$in{'q2-2'}; $d[8]=$in{'q2-3'}; # 未入力チェック  if($d[0] eq ""){$error[0]="名前入力";} if($d[1] eq ""){$error[1]="性別を入力";} if($d[2] eq ""){$error[2]="年齢を入力";} if($d[3] eq ""){$error[3]="質問1-1を入力";} if($d[4] eq ""){$error[4]="質問1-2を入力";} if($d[5] eq ""){$error[5]="質問1-3を入力";} if($d[6] eq ""){$error[6]="質問2-1を入力";} if($d[7] eq ""){$error[7]="質問2-2を入力";} if($d[8] eq ""){$error[8]="質問2-3を入力";} # データをカンマ区切りにしてdata.csvに保存 $data=join(",",$d[0],$d[1],$d[2],$d[3],$d[4],$d[5],$d[6],$d[7],$d[8])."\n"; open(FH,">>./data.csv"); print FH $data; close FH; 省略

    • 締切済み
    • CGI
  • CGIROOMさんのデータベース機能について、管理者と連絡取りたい

    CGIROOMさんのデータベース機能について、管理者と連絡取りたい。 また、簡易高機能検索専用データベース ソート版(http://cgiroom.nu/list/database/database2s/)と、database.cgi用 データエディタ(http://cgiroom.nu/list/database/dataedit/index.htm)を併用して利用しているのですが、データファイルの容量が300k以上になると、エラーが表示されてしまうのですが、これを解除する方法をどなたか教えていただけませんか? ソースデータ if($FORM{'cmd'} eq "edit" && $FORM{'line'}){ &error('300k以上あるデータは修正できません') if -s $FILE > 01234567; open(IN,$FILE) || &error('データファイルを開けません'); @data = <IN>; close(IN); if($FORM{'write'}){ &error('行指定が不正です') if $FORM{'line'} =~ /\D/; $data[$FORM{'line'} - 1] = join("\t",@line[1..$#line],"\n"); open(OUT,">".$FILE)|| &error('データファイルを更新できません'); print OUT @data; close(OUT); &msg('更新しました'); } @data = split(/\t/,"\t".$data[$FORM{'line'} - 1]); &error('指定されたデータは存在しません') unless @data; open(HTML,$FORM)||&error('フォームファイルを開けません'); read(HTML,$html,-s HTML); close(HTML); $html =~ s/__(cmd|line)__/$FORM{$1}/g; $html =~ s/__data(\d+)([a-zA-Z]*)__/&tag($data[$1],$2)/eg; &html(\$html); }elsif($FORM{'cmd'} eq "new"){ &error('300k以上あるデータは修正できません') if -s $FILE > 01234567; if($FORM{'write'}){ if($unshift){ open(IN,$FILE) || &error('データファイルを開けません'); @data = <IN>; close(IN); open(OUT,">".$FILE)|| &error('データファイルを更新できません'); print OUT join("\t",@line[1..$#line],"\n"),@data; close(OUT); }else{ open(OUT,">>".$FILE)|| &error('データファイルを更新できません'); print OUT join("\t",@line[1..$#line],"\n"); close(OUT); } &msg('データを追加しました'); } open(HTML,$FORM)||&error('フォームファイルを開けません'); read(HTML,$html,-s HTML); close(HTML); $html =~ s/__cmd__/$FORM{'cmd'}/g; $html =~ s/__data\d+[a-zA-Z]*__//g; &html(\$html); }elsif($FORM{'cmd'} eq "delete" && $FORM{'line'}){ &error('300k以上あるデータは修正できません') if -s $FILE > 01234567; &error('行指定が不正です') if $FORM{'line'} =~ /\D/; open(IN,$FILE) || &error('データファイルを開けません'); @data = <IN>; close(IN); &error('指定されたデータは存在しません') unless $data[$FORM{'line'} - 1]; undef $data[$FORM{'line'} - 1]; open(OUT,">".$FILE)|| &error('データファイルを更新できません'); print OUT @data; close(OUT); &msg('指定されたデータを削除しました'); } どこを修正すればいいのでしょうか?

  • Perl BBS 掲示板 改行処理

    改行処理について教えてください。 今まで書き込み処理で unshift @DATA, "$tm,$FORM{'name'},$FORM{'title'},$FORM{'text'}\n"; としていたのですが、これを use CGI; my $form = new CGI; my $NAME = $form->param('name'); my $TITLE = $form->param('title'); my $TEXT = $form->param('text'); unshift(@DATA,"$tm,$NAME,$TITLE,$TEXT\n"); に変更しました。 すると sub loadFormdata が聞かなくなり、 改行処理他が対応しなくなってしまいました、 この場合、 loadFormdataの部分のどこを変えればよいでしょうか? |------書き込み処理------| sub printdata{ use CGI; my $form = new CGI; &loadFormdata(); open(FILE, "<$FILE"); eval{ flock(FILE, 1) }; @DATA = <FILE>; close FILE; my $tm = time; my $NAME = $form->param('name'); my $TITLE = $form->param('title'); my $TEXT = $form->param('text'); unshift(@DATA,"$tm,$NAME,$TITLE,$TEXT\n"); while(@DATA > $MAX) { pop @DATA; } open(FILE, ">$FILE") or die("error :$!"); eval{ flock(FILE, 2) }; print FILE @DATA; close FILE; } |------改行処理他------| sub loadFormdata { my ($query, $pair); if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; } foreach $pair (split(/&/, $query)) { my $key = ("$NAME,$TITLE,$TEXT"); my ($key, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; $value =~ s/&/&amp;/g; $value =~ s/</&lt;/g; $value =~ s/>/&gt;/g; $value =~ s/\x0D\x0A\s*/<br>/g; $value =~ s/\s+/ /; $FORM{$key} = $value; } }

    • ベストアンサー
    • Perl
  • 【再】Cookieを使用してフォームで送信

    #!/usr/local/bin/perl # ライブラリ require 'cgi-lib.pl'; require 'jcode.pl'; require 'keiji_write_sub.pl'; # デコード &ReadParse(*form); # 名前・メッセージ欄のチェック if ($form{'name'} eq "" || $form{'message'} eq "") { # 名前・メッセージが空ならエラー &input_error; # 終了 exit; } else { # 名前・メッセージも空でないなら書込処理 # HTMLタグと衝突する記号を変換 $name = &henkan($form{'name'}); $mail = &henkan($form{'mail'}); $title = &henkan($form{'title'}); $message = &henkan($form{'message'}); $message =~ s/\r\n/<BR>/g; # 日本語表記の日時を得る $time = &jp_time; # データを1行に(区切りはコロン) $new_data = "$time:$name:$mail:$title:$message\n"; &jcode'convert(*new_data, 'sjis'); open(KEIJI, "<keijiban.dat") || die "File 'keijiban.dat' Open Error."; # 過去のデータを全て配列に読み込む @all_data = <KEIJI>; close(KEIJI); # 配列の先頭に新規データ追加 unshift(@all_data, $new_data); open(KEIJI, ">keijiban.dat") || die "File 'keijiban.dat' Open Error."; #flock(KEIJI, 2); # (新規データ+過去データ)をファイルに上書き print KEIJI @all_data; #flock(KEIJI, 8); close(KEIJI); # 書込完了メッセ &write_ok; } というコードでdatファイルに書き込みしています。 この時に、名前などを1度入力したらCookieに記憶させて次からは自動で入るようにしたいのです。 あちこち検索して読んだりしたのですが、わからなくて…。 どなたか教えてください。

    • ベストアンサー
    • CGI
  • フォームからアップロードされた画像ファイルの処理

    フォームからアップロードされてきた画像ファイルを、適当なファイル名を付けてJPGあるいはGIFの拡張子で保存し、HTMLファイルで保存した画像を一覧表示させようというCGIスクリプトを作りたいと考えています。 質問1 <FORM action="xxxx.cgi" method="post" enctype="multipart/form-data"> <INPUT type="file" name="gazo"> <INPUT type="submit"> </FORM> とこんな具合のフォームから画像ファイル(JPGやGIF)をアップロードした時、 受け手のxxxx.cgiでは、この画像ファイルのデータをどのように受けたらよいのでしょうか? read(STDIN,$_,$ENV{'CONTENT_LENGTH'});としたり、 あるいは cgi-lib.plを読み込んで、$in{'gazo'} というような形で画像ファイルのデータを受け取ればよいのでしょうか? 質問2 画像ファイルを受け取ったとして、フォームから送られてきた画像ファイルがJPGなのかGIFなのかを判別することは可能でしょうか? 可能ならば、判別するためのスクリプトはどんなものが考えられるでしょうか? (フォームから送られてくる画像ファイルのデータの何をチェックすれば、JPGかGIFかを判別できるのでしょうか?) もしご回答頂ける方がおられればご教授ください。よろしくお願いします。 なお、「既存のスクリプトを利用しなさい」というような回答やアドバイスならば不要でございます。

    • ベストアンサー
    • Perl
  • 携帯用のメールフォームのMethod

    ある、HP作成送付とを使って携帯用のメールフォーム(3機種対応)を作りましたが、既存のCGIがうまく稼動しません。 マニュアルをみると、携帯用ではMethodをPOSTではなく、GETに指定しろ。 と、有りますが、CGIのソースのどの部分を変更したらいいのか分かりません。 一応、予測してPOSTと記載されているソースを全てGET に直したのですが、旨く、稼動しません。 (「このCGIは直接稼動していません・・・」が表示される。if ($buffer eq '') ってどんな条件なんでしょうか?) 携帯用のメールフォームのCGIを配布しているサイト、もしくは下記のソースで修正すべき点をご存知の方、 教えてください!!お願いいたします。 ソース-------------------- . . . #データ入力 if ($ENV{'REQUEST_METHOD'} ne "GET") { &error('エラー','標準入力 METHOD=GET を設定してください.<br>&lt;form method=get action=........&gt;'); } read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); if ($buffer eq '') { &error('エラー','このCGIは直接起動されません.'); } $ref = $ENV{'HTTP_REFERER'}; $buffer2 = $ENV{'QUERY_STRING'}; if ($buffer2 ne '') { &error('エラー','標準入力 METHOD=GET に設定してください.<br>&lt;form method=get action=........&gt;'); }

    • ベストアンサー
    • CGI
  • フォームでの、巨大ファイルデータのアップロード

    form input type="file" を使ってファイルデータをアップロードし、perl の標準入力からデータを取得します。 この時、約30メガくらいまでなら正常に取得可能ですが、それ以上になると、CGI側でエラーが出ます。このことについてサーバー業者に問合せをしたところ、 「CGIの動作時間が長くかかる場合、該当のスクリプトの動作が負荷軽減のため、仕様により中断される場合がございます。」という解答でした。 大きなファイルを転送する方法が不明です。 どなたかご回答をお願いできますでしょうか。 宜しくお願い致します。

  • .htaccessでのdenyを記録する方法は?

    不正なアクセスに対して、.htaccessでIPアドレスでdenyするようにしていますが、denyする対象を追加していくときりがないので、設定後一定期間アクセスがないものは外すようにしています。 エラーログを見られるサーバーはエラーログで判断していますが、ログを見られないサーバー(レンタルサーバー)もあるので、.htaccessでのdenyを独自に記録したいと思います。 403エラーのエラエードキュメントとしてログを記録するcgiを指定すると、このcgiにもアクセスできないので記録できません。 特定のIPアドレスからのアクセスに対して、これを記録するcgiへリダイレクトするというようなことはできないでしょうか?

  • フォームから値を配列に渡すときの処理方法

    フォームから値を配列に渡すときの処理方法 PERLでフォームからのデータの受け取り方、処理の仕方でご教授頂ければ助かります。 よろしくお願いいたします。 配列の要素数の調べ方、処理方法についてご教授頂ければ幸いです。 HTMLよりフォームのデータをcgi-lib.plの[&ReadParse(*in);]受け取っているのですが ●HTML側 セレクトボックスを5つ用意し同じNAME (select01)のnameを付けて CGI側で受け取りたいと考えております。 (基本的に間違えでしょうか?セレクトボックスの個数分用意したほうがいいでしょうか?) 受け取った値をCGI側で受け取り要素の個数をカウントさせ 条件に合わせてERRORを出したいと考えたのですが・・・ エラーの内容は 1っこ選んであればOKでそれ以外 0の場合はNG 2個以上選択した場合は NGという形を取りたいのですが。 配列の要素数で分岐できるのかと考えたのですが そもそもこの考え、処理方法は間違えでしょうか? アドバイスを頂ければ幸いですm(__)m require 'cgi-lib.pl'; &ReadParse(*in); ------------------------- # データ代入 @aaa =$in{'select01'}; #フォームデータを配列に代入 $count= @aaa; この場合だと 要素の数($count)は 1になっております。 いろいろ調べていますと cgi-lib.pl を使用した場合はブラウザ上で スペースに見えるが \0 だそうで・・・・ カンマで区切って 要素数を正しく表示させたいと思ったのですがうまくいきません。。 @aaa = split(/\0/,$in{'select01'}); などいろいろ試してみたのですが区切りがうまくいきません また、 $" = ','; @aaa = split(/\0/,$in{'select01'}); とすると カウントが変わったのですが・・・・ フォーム側の一番目を選択して送信するとカウントが 1!!  1と5番目を選択して送信したら 5!え?? で要素数を正しくカウントされていないようです。 ちなみに print @aaa; としてみると aaa,,,,eee と空の内容がカウントされてる?ようなかたちになりました。 ここで、行き詰ってしまいまして、もともとの私の安易な考えが間違えなのか? 書き方が間違えなのか。 と思い皆さまのアドバイスを頂ければ幸いです。 ・プログラムの考え方的には間違えなのか ・一般的な正しい処理方法はどうなのか それとも。。。。要素数で分岐することが可能であるのか。 お手数ですがアドバイス頂ければ幸いです。

    • ベストアンサー
    • Perl