なぜIDのフォームだけ数値としてしか扱えないのか?

このQ&Aのポイント
  • 自力でアクセス制限のCGIを作ろうと思って独学で勉強しているのですが、フォームからのデータの受け取りがうまくいきません。
  • IDのフォームデータは数値として扱っていないようで、文字数さえあっていればどんな文字列でもOKという状態になってしまいます。
  • IDの入力データを文字列として扱いたくて数値用比較演算子『!=』の部分をPSと同じく文字用比較演算子『ne』にしたいのですが、そうするとうまく動作しません。どうしてIDのフォームだけ数値としてしか扱えないのでしょうか?また文字列として扱えるようにするにはどこを直せば良いのでしょうか。教えてください。お願いします。
回答を見る
  • ベストアンサー

どうしてか全くわかりません。

自力でアクセス制限のCGIを作ろうと思って独学で勉強しているのですが、フォームからのデータの受け取りがうまくいきません。 今の状況を抜粋して載せた方が早いと思いますので、長くなってしまいますがお許しください。 ---トップのページ(HTML)抜粋--- <form method="post" action="./Certification.cgi"> ID:<input type="text" name="id" size=17> PS:<input type="password" name="ps" size=17> <input type="submit" value="ログイン"> ---Certification.cgi(Perl)抜粋--- #!/usr/local/bin/perl require 'cgi-lib.pl'; &ReadParse(*input_data); #キーファイルオープン open(DAT,"<key.dat"); #判別変数宣言 $dec=0; #入力データ格納 $id=$input_data{'id'}; $ps=$input_data{'ps'}; #キー格納 $keyid=<DAT>; $keyps=<DAT>; #判別 if($id != $keyid){$dec=1;} if($ps ne $keyps){$dec=1;} ※以下、$decが0ならばOK、$decが1ならばNGという文をifを用いて記述。 ---key.data(ログインできるIDとPSを記述)--- (1行目)abc (2行目)efg 以上です。 ※フォームデータのデコード?にはcgi-libライブラリというものを使っています。 この状態では、PSのフォームデータは正しく評価され、 ちゃんと機能しているのですが、(#判別のIDの部分からもわかる通り)IDのフォームデータは数値として扱っていないようで、文字数さえあっていればどんな文字列でもOKという状態になってしまいます。 それで、IDの入力データを文字列として扱いたくて数値用比較演算子『!=』の部分をPSと同じく文字用比較演算子『ne』にしたいのですが、そうするとうまく動作しません。 どうしてIDのフォームだけ数値としてしか扱えないのでしょうか?また文字列として扱えるようにするにはどこを直せば良いのでしょうか。教えてください。お願いします。

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

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

  • ベストアンサー
  • estea
  • ベストアンサー率44% (39/87)
回答No.1

キー格納と判定の間に処理が必要なきがします。あるいは判定処理を変更すべきです。 ファイルの内容を <DAT>から意味出した際に 各行のは改行コードも一緒に受け取ります。 これを取り除いてから ne で判定するか、 判定式を正規表現で記述してはどうでしょう

masaru2032
質問者

お礼

ありがとうございました!! やっとできました! おっしゃる通り、改行コード2文字分をキーID変数から取り除くことでうまくいきました! どうもありがとうございました!!

関連するQ&A

  • strutsプログラミングでの疑問

    初心者質問で恐縮です。 以下のように(1)アクションフォームと(2)JSPに設定して、idが未入力(null)でサブミットされた場合の(3)アクションをif文で分岐させたいのですが、条件の設定はどのようにすればいいのでしょうか? (1)アクションフォーム(java)の設定(抜粋)   private int id;  //IDをint型に設定 (2)登録フォーム(JSP)の設定(抜粋)   <input type="text" name="id" > <%--IDを登録する--%> (3)アクション(java)の条件分岐の設定(抜粋)   int input_id = aform.getId();   if(input_id==null){   } nullにするとエラーになってしまいます。

    • ベストアンサー
    • Java
  • .DATファイルに書き込まれている内容に応じてセレクトボックスの内容に情報を追加する

    次のようなフォームが10個並んでいるhtmlのページがあります。 (下記URLのドメインは架空のものです) <form action="http://www.host.com/cgi-bin/takeset.cgi" method="POST"> <SELECT NAME="koma"> <OPTION>1 <OPTION>2 <OPTION>4 </SELECT> <input type="hidden" name="kougimei" value="文学"> <input type="hidden" name="tani" value="4"> <input type="hidden" name="kouginumber" value="1006"></td> <input name="SUBMIT" type="submit" value="計算"></div> </form> この10個中の1つのフォームだけ、 「<input type="hidden" name="kougimei" value="文学">」の部分を<SELECT NAME=....>にして、 <SELECT NAME="(ここはどうしたら良いかわかりません)"> <OPTION>哲学 田中 <OPTION>哲学 鈴木 <OPTION>哲学 山田 として、このセレクトボックス1つを選択するだけでCGIにkougimei="哲学" bikou1="田中" bikou2=""と3つの値を渡したいのですが、どうしたらいいでしょう? そして、通常はbikou2は""という空の値ですが、cgi-binディレクトリにある.datの値(「0」か「1」か「2」というデータが他のCGIから書き込まれています)を読み取って、もしtanaka.datに「1」というデータが入っていたらセレクトボックスの内容を「哲学 田中 外部」、tanaka.datに「2」という数字が入っていたら「哲学 田中 休講」、tanaka.datに「0」という数字が入っていたら「哲学 田中」のまま、suzuki.datに「2」という数字が入っていたら「哲学 鈴木 休講」といったように表示内容とbikou2の内容を変えたいのです。 データを送る先のCGIはレンタルCGIなので改造が出来ず、フォームのページもこれ自体をCGIにしてしまうことが出来ません。 せいぜいJavascriptにするくらいしか出来ないのですが、何とかならないでしょうか?

    • ベストアンサー
    • HTML
  • Rubyでの条件分岐について

    登録フォームについての質問です。 ログイン用フォームのhome.cgi と、それにリンクするユーザー登録用フォームのregistration.cgi があり、今回質問するのはユーザー登録用のregistration.cgiの方です。そしてユーザーIDとPasswordはdata.txtに書き込んでいます。書き込み自体は成功するのですが、それ以外のところで問題がでている状態です。条件分岐がうまくいきません。 下記のように書いた時におこる問題点等について教えていただきたいと思います。 (1)IDとPassword のinput に値が空の時に、ボタンを押しても、登録完了しました と表示されてしまうので、この様な場合は、"もういちど確認してください" などの警告文を出したいです。 (2)IDとPassword の文字数に制限を入れたいのですが、分かりませんでした。 双方とも4文字以上8文字以下にしたいです。それ以外の場合は、条件分岐で、"文字数を確認してください"などの警告文を出したいです。 -------- < ここから registration.cgi >-------------------- #!/usr/bin/ruby require "cgi" cgi = CGI.new puts <<HTML Content-Type: text/html <html> <head> <title>練習問題</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <h1>練習(1)</h1> 登録フォーム <form action="registration.cgi" method="post"> ユーザーID:<input type="text" name="login" ><br> パスワード:<input type="text" name="password"><br> <input type="submit" value="submit"> </form> HTML if cgi.params["login"][0] then f = open("data.txt","a") f.puts"%s:%s" %[cgi.params["login"][0],cgi.params["password"][0]] f.close puts "登録完了しました" else end puts <<HTML <br> <a href="./home.cgi">戻る</a> HTML -------- < ここまで >--------------------

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

    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
  • フォームからアップロードされた画像ファイルの処理

    フォームからアップロードされてきた画像ファイルを、適当なファイル名を付けて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
  • cgi上のhtmlをrubyのifで条件分岐

    rubyでcgiをつくっています。 htmlのinputとruybの絡めかたがわかりません教えてください。 まず下記のようにボタンを設置して、 <form> <input type="button" value="新規登録"> </form>  ↑ ボタンを押したら、LoginとIDの登録フォームがでてきて、 それ以外なら変化なし のようなものをつくりたいのですが、どのようにifで書けばよいのかが分かりませんでした。教えてくださいよろしくお願いします。

    • ベストアンサー
    • Ruby
  • RubyでCGIからの入力値を数値として扱いたい

    ウェブのフォームから数値を入力し、 それを受け取って、cgiの中で演算したいのですが、うまくいきません。 input = CGI.new birth = input["birth"] #西暦1982年を入力 print -(birth - 1927)%9+1 #この演算をしたいのですが、できません。

    • ベストアンサー
    • Ruby
  • チェックボックスで得た複数回答をCGIモジュールを用いて簡潔に取り出すには

     <input type="checkbox" name="id" value="0">  <input type="checkbox" name="id" value="1">  <input type="checkbox" name="id" value="2">  <input type="checkbox" name="id" value="3"> のようなフォームのキーと値を、CGIの方では%inで受け取ります。 まずCGIモジュールを用いてキーと値を$keyと$valに格納したのち、idというキーは4つの値を受け取るので、  foreach my $key ($q->param()) {   my $val=$q->param($val);   if(defined($in{$key)) {    $in{$key}.="\0";   }   $in{$key}.=$val;  } 私のイメージでは、この処理で  $in{'id'}="0\01\02\03"; が得られるつもりでした。 ところが実際には$q->param('id')で取り出せるのは最初の"0"のみで、したがって得られる結果は  $in{'id'}="0"; となります。 CGIモジュールを使わなければ、  my $buf;  if(ENV{'REQUEST_METHOD'} eq "POST") {   read(STDIN,$buf,$ENV{'CONTENT-LENGTH'});  }  else {   $buf=$ENV{'QUERY_STRING'};  }    foreach(split(/&/,$buf)) {   my ($key,$val)=split(/=/);      if(defined($in{$key)) {    $in{$key}.="\0";   }   $in{$key}.=$val;  } のようにして、イメージ通り  $in{'id'}="0\01\02\03"; を得られますが、CGIモジュールは他でも使うので、どうせならCGIモジュールを使った簡便なコーディングが出来ないものかと思案する次第です。 しかしながら私に思いつく方法は  <input type="checkbox" name="id0" value="0">  <input type="checkbox" name="id1" value="1">  <input type="checkbox" name="id2" value="2">  <input type="checkbox" name="id3" value="3"> として、まずCGIモジュールを用いた上記の方法で$in{'id0'}~$in{'id3'}までを生成し、次に  if(/(\w+)\d/) {   if(defined($in{$1})) {    $in{$1}.="\0";   }   $in{$1}.=$val;  } とやる方法しか思いつきません。 チェックボックスを用いて複数回答を得るというのはよくある話なので、CGIモジュールにもっと良いコーディングの仕方がありそうな・・・と思ってしまうのですが、これが最善の方法なのでしょうか?

    • ベストアンサー
    • Perl
  • 文字化けとパスワード変更

    perlでCGIを作っています。入力フォームで文字を入力すると、text.dataでは文字化けしています。CGI上の文字は大丈夫なのですが・・。どのように対処すればいいでしょうか? あと、if構文を試していたら、正解を書いても、パスワードを変えても対応せずに間違いだという画面しか出ません。必要があればプログラムも載せます。考えれることを教えてください。

    • ベストアンサー
    • CGI
  • 文字列の比較の仕方が分かりません

    フォームから入力された文字列をデータファイルの中から検索し、重複していなければ追加登録したい。 ・問題点 重複していても登録できてしまう。 昨日からperlを触り始めたばかりなので、基本的な部分が分かっておらず、 おかしい部分が多々あるかもしれませんが、ご指導よろしくお願い致します。 データは全て"["から始まるので、登録できませんの部分は、簡単な入力チェックです。 -------------------------------------------- test.html <html> <head> <meta http-equiv="Content-type" content="text/html; charset=UTF-8"> </head> <body> <form action="test2.cgi" method="post"> <input type="text" name="shirolist" size="50" /> <input type="submit" name="submit" value="送信" /> </form> </body> </html> -------------------------------------------- test2.cgi #!/usr/local/bin/perl use utf8; use CGI; $q = new CGI; $flag = 0; $data = $q -> param('shirolist'); $data =~ s/\s+//g; open(IN , "<:uft8" , "data.dat"); while($line=<IN>){ if ( $line eq $data ) { $flag = 1; } } close(IN); if($flag == 0){ if ($data =~ /^\[/) { open(OUT,">>data.dat"); print OUT "$data\n"; close(OUT); $pr="を登録しました"; } else { $pr="は登録できません"; } } else { $pr="は登録済みです"; } print "Content-Type: text/html; charset=UTF-8\n"; print "$data $pr<br>\n"; ※Yahoo知恵袋で同様の質問をしましたが、 回答者への個別のコメントや追加質問が出来ず、 非常に使いづらく感じたのでこちらに投稿させて頂きました。

    • ベストアンサー
    • Perl

専門家に質問してみよう