• ベストアンサー

簡単なユーザーページ

掲示板的なものを改造中です。 各ユーザーにパスワードを配布し、そのパスワードで入場すると、ユーザー名やアイコンがすでにセットされた状態で書き込みが出来るようにしたいと考えています。 そこで、簡単ですが、以下のようにやってみました。 sub admin { @new=(); open(FILE,"$userfile") || &error("Open Error : $userfileが開けません"); $top = <FILE>; while (<FILE>) { #while open ($userno,$cpwd,$cnam,$cico) = split(/<>/); if ($in{'pass'} eq $cpwd) { #if open &header; print <<"EOM"; <TABLE > <TBODY> <TR> <TD bgcolor="$obi_color" align="center"><font color="$tx"><B>新 規 記 事<B></font></TD> </TR> <TR> <TD><BR></TD> </TR> EOM # 投稿フォーム &form(); }else{ &error("パスワードがちゃいます"); } } #while close exit; --------------------------- datファイル 3<>0003<>イッシー<>is.jpg<> 2<>0002<>ますます<>ma.jpg<> 1<>0001<>うっちー<>un.jpg<> --------------------------- こうすると、パスワードが違いますと言われてしまいます。 しかも、パスワードを「0002」にすると、入場は出来るのですが、下に「パスワードがちゃいます」のエラーが表示されてしまいます。 どこが間違ってますか? また、必要な情報が足りていない場合は指摘してください。すぐに掲載します。

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

  • ベストアンサー
  • grape16
  • ベストアンサー率55% (52/93)
回答No.4

&form();の方にユーザー名などを送りたいのときは&form($userno, $cnam, $cico)として,sub formの方の頭を, sub form { ($userno, $cnam, $cico) = @_; としておけばよいでしょう。すると,sub formに$userno, $cnam, $cicoが渡されます。そうした上で <input type=text name=name size=28 value="$cnam"> のようにすれば大丈夫じゃないかと思います。

master-3rd
質問者

お礼

ありがとうございます。 ばっちり出来ました

その他の回答 (3)

  • grape16
  • ベストアンサー率55% (52/93)
回答No.3

No.1中の$pwmatchは$pwdmatchに訂正します。すみません

master-3rd
質問者

補足

すばやい返答ありがとうございます。 修正してログインすることは出来ました。しかし、変数を送ることが出来ません。 &form();の方にユーザー名などを送りたいのですが、空白のままです。 <input type=text name=name size=28 value="$cnam"> こんな感じで間違えは無いですよね? $in{'cnam'}じゃおかしいですよね。 もしかして、formの方にも何か変更が必要なのでしょうか?

回答No.2

そのプログラムは単純に書くとこんな感じですよね。 (<FILE> で読むとパスワードだけ読めると思って下さい)。 while (<FILE>) {  chomp;  $pass = $_;  if ($pass eq $query) {   print "一致したパスワード発見\n";  } else {   print "エラー\n";  } } よーく見て下さい。$pass が $query に一致していない時は全て "エラー\n" が出力されます。これと同じことです。

master-3rd
質問者

補足

指摘ありがとうございます。 しかし、どうすれば改善できるかがさっぱりです。 No1の方のものを試してみましたが、どうもうまくいかず… よろしければ、そのものずばりの解決方法を教えていただけないでしょうか? お願いします。

  • grape16
  • ベストアンサー率55% (52/93)
回答No.1

下記のコードにようにエラーメッセージはwhileループを抜けてから,ループ中一度もパスワードがマッチしなかったときに表示するようにしたほうがいいと思います。 sub admin { @new=(); open(FILE,"$userfile") || &error("Open Error : $userfileが開けません"); $top = <FILE>; $pwdmatch = 0; #パスワードがマッチしたら真となる変数 while (<FILE>) { #while open ($userno,$cpwd,$cnam,$cico) = split(/<>/); $pwdmatch = ($in{'pass'} eq $cpwd); if ($pwmatch) { last; } } #while close if ($pwmatch) { &header; print <<"EOM"; …中略… EOM # 投稿フォーム &form(); }else{ &error("パスワードがちゃいます"); } exit;

master-3rd
質問者

補足

すばやい返答ありがとうございます。 が、今度はすべて「パスワードがちゃいます」になってしまいました。 コピペしたので、記入し間違えでは無いと思うのですが…

関連するQ&A