- ベストアンサー
同一のメールアドレスの禁止設定を追加したい
- 同一のメールアドレスを禁止する掲示板の設定方法について調査しました。
- 男性と女性のログが別々のフォルダにあり、どちらのログにも同じメールアドレスの禁止設定を追加したいです。
- 過去のログファイルが消える問題があったため、二重登録のチェックを行い、重複したメールアドレスの登録を防止します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
動いたのであればそれでOKなのですが、せっかくなのでちゃんとやりましょうか。 これで男性・女性ともアドレスチェックをしたのちに書き込みとなります。 #--パスワードを暗号化--# $m_pass = crypt($pass, "xx"); if ($title eq "") { $title = "無 題"; } if ($in{'noage'} eq "1") { $noage = "1"; } else { $noage = "0"; } &lock1; if ($sex eq "0") { if (!open(IN,"$mensfile")) { &lock2; &error("$mensfile ファイルオープンエラー"); } } elsif ($sex eq "1") { if (!open(IN,"$ladysfile")) { &lock2; &error("$ladysfile ファイルオープンエラー"); } } $line = <IN>; ($r0,$r1,$r2,$r3,$r4,$r5,$r6,$r7,$r8,$r9,$r10,$r11) = split(/\,/, $line); #--二重投稿チェック--# if ($r1 eq "$name" && $r4 eq "$street<>$title" && $r5 eq "$comment") { &lock2; &error("二重投稿は禁止です!"); } #--最新の記事ナンバーをつける--# $r0++; $no = "$r0"; #--メールアドレスの重複チェック--# if ($r2 eq $mail) { &error("このメールアドレスは既に書き込み済です"); } while ($line = <IN>) { ($r0,$r1,$r2,$r3,$r4,$r5,$r6,$r7,$r8,$r9,$r10,$r11) = split(/\,/, $line); if ($r2 eq $mail) { &error("このメールアドレスは既に書き込み済です"); } } close(IN); #--異性ログファイルのメールアドレスの重複チェック--# if ($sex eq "0") {open(IN,"$ladysfile") || &error("Open Error: $ladysfile");} if ($sex eq "1") {open(IN,"$mensfile") || &error("Open Error: $mensfile");} while ($line = <IN>) { ($r0,$r1,$r2,$r3,$r4,$r5,$r6,$r7,$r8,$r9,$r10,$r11) = split(/\,/, $line); if ($r2 eq $mail) { &error("このメールアドレスは既に書き込み済です"); } } close(IN); #--データを整形--# $state = "$street<>$title"; $age = "$age_y<>$age_m<>$age_d<>$noage"; $format = "$no,$name,$mail,$age,$state,$comment,$hoop,$risou,$max,$date$time,$H_A,$m_pass\n"; #--男性の場合の登録処理--# if ($sex eq "0") { &mens_read("lock2"); $num = unshift(@DATA, $format); if ($num > $maxlog) { pop @DATA; } if (!open(OUT,">$mensfile")) { &lock2; &error("$mensfile ファイルオープンエラー"); } print OUT @DATA; close(OUT); } #--女性の場合の登録処理--# elsif ($sex eq "1") { &ladys_read("lock2"); $num = unshift(@DATA, $format); if ($num > $maxlog) { pop @DATA; } if (!open(OUT,">$ladysfile")) { &lock2; &error("$ladysfile ファイルオープンエラー"); } print OUT @DATA; close(OUT); } &lock2;
その他の回答 (2)
- luka3
- ベストアンサー率72% (434/598)
まだ不明な点がありますが、単純に書くとこうなります。 「二重投稿は禁止です」と「登録処理」の間に組み込みます。 # 男性ログファイル open(IN,"$mensfile") || &error("Open Error: $mensfile"); local(@file) = <IN>; close(IN); # メールアドレスの重複チェック foreach (@file) { local($id,$nam,$eml,) = split(/<>/); #★1 if ($email eq $eml) { &error("このメールアドレスは既に登録済です"); } #★2 } # 女性ログファイル にも同様の処理をする(以下略) 不明な点として、★1ですがsplitの中身は男性登録処理のところにある$formatの形式に合わせて下さい。 登録処理の少し前に以下のような行がないでしょうか。 $format = "$number<>$date<>$name<>$email<>$title<>$comment\n"; このようになっていればそのままでいいですが、<>の部分が\tだったらsplit(/\t/)に変えて下さい。 そしてsplitの左側も$formatに合わせて変えて下さい。 3行上の例だったら、local($num,$dt,$nam,$eml,) といった具合にします。 このとき$formatで使われている名前と重複しないよう少し変えて下さい($name→$nam、$email→$eml) もし$formatで使われているメールアドレスが入っている変数名が$emailじゃなかったら、★2の$emailも変更します。 この重複チェック処理はログファイルを読み込むだけですので、消えることはありませんが、ログファイルをバックアップしてから試した方が安全だと思います。 あと二重投稿チェックでログファイルを読み込んでいるのなら、その時に処理した方が効率いいですね。
- luka3
- ベストアンサー率72% (434/598)
見た感じ、おかしいと思うのは一点、 (1)の if(@v[0] eq $name){ が if($v[0] eq $name){ だろうというくらいで、ほかは特にプログラム的には問題ないと思います。 質問文とプログラムがいまいち一致していないようで、どうしたいのかがわからないので回答しずらいです。
お礼
また補足なんですが、ベーシック認証には同一のメールアドレス拒否は組み込めたんです。それが以下の部分なんですが、、 # 会員ファイル open(IN,"$memfile") || &error("Open Error: $memfile"); local(@file) = <IN>; close(IN); #▼ここから▼ # 名前、メールアドレスのダブりチェック $flag=0; foreach (@file) { local($id,$nam,$eml,) = split(/<>/); if ($in{'name'} eq $nam) { $flag=1; last; } if ($in{'eml1'} eq $eml) { $flag=2; last; } } if ($flag == 1) { &error("$in{'name'}は既に登録済です。<br>他の名前をご指定ください"); } if ($flag == 2) { &error("$in{'eml1'}は既に登録済です。<br>他のメールアドレスをご指定ください"); } #▲ここまで追加▲ unshift(@file,"$in{'id'}<>$in{'name'}<>$in{'eml1'}<><>\n"); open(OUT,">$memfile") || &error("Write Error: $memfile"); print OUT @file; close(OUT); #▼ここから▼ # パスファイル追加 open(OUT,">>$pwdfile") || &error("Write Error: $pwdfile"); print OUT "$in{'id'}:$pw2\n"; close(OUT); #▲ここまで追加▲ # ロック解除 &unlock if ($lockkey); # 時間取得 $date = &get_time; これをメールアドレスだけにして、男女別のログファイルを見に行って処理するようにすればできるとは思っているんですが。。 (1)(2)とも上記とも混ぜて適当に合いそうな文法作ってアップして試し書きしてみたら、男女ともログファイルが無くなって、1件ずつしかなくなってしまったんです。 どうやら文法間違えてログを上書きしてしまったのかなと思いました。 CGI(Perl)って面白いけど、難しいですよね。 一文字間違えただけでエラーですものね。。
補足
お答え有難うございます。 失礼しました。 (1)(2)ともフリーのCGI落として中身を調べて、メールアドレス二重チェックの部分を抜き出したもので、根本的なことは初心者なので分からずじまいです。 #--二重投稿チェック--# if ($r1 eq "$name" && $r4 eq "$street<>$title" && $r5 eq "$comment") { &lock2; &error("二重投稿は禁止です!") なら組み込まれていたんですが。。 この下には #--男性の場合の登録処理--# if ($sex eq "0") { &mens_read("lock2"); $num = unshift(@DATA, $format); if ($num > $maxlog) { pop @DATA; } if (!open(OUT,">$mensfile")) { &lock2; &error("$mensfile ファイルオープンエラー"); } print OUT @DATA; close(OUT); } #--女性の場合の登録処理--# elsif ($sex eq "1") { &ladys_read("lock2"); $num = unshift(@DATA, $format); if ($num > $maxlog) { pop @DATA; } if (!open(OUT,">$ladysfile")) { &lock2; &error("$ladysfile ファイルオープンエラー"); } print OUT @DATA; close(OUT); } &lock2; 上のように登録処理があります。 こんな感じで様々な機能を独学で組み込んで機能しているんですが、このメールアドレス二重チェックだけができません。 ログファイルを見に行って、既に書き込みしたメールアドレスを読み込み、該当すればエラーを出すと。 なんとなく頭で理解できるのですが、文法がサッパリです。 何卒よろしくお願い致します。
お礼
数え切れないくらいやり直ししたら出ました! 「Error : このメールアドレスは既に書き込み済です」の文字が!! 合っているのかわかりませんが・・? $formatが「,(カンマ)」で区切られていたので、splitの(/,/);をこう記述して、「,(カンマ)」だったので、この($num,$nam,$eml,)中身をこう記述しました。 同じアドレスで書き込みしようとすると、上記の注意が出ててきました。男性しか試していませんが、以下の通りです。 # 男性ログファイル open(IN,"$mensfile") || &error("Open Error: $mensfile"); local(@file) = <IN>; close(IN); # メールアドレスの重複チェック foreach (@file) { local($num,$nam,$eml,) = split(/,/); #★1 if ($mail eq $eml) { &error("このメールアドレスは既に書き込み済です"); } #★2 } これで100%でしょうか?
補足
詳しい説明、本当に有難うございます。 必死でやりました。 エラーは出ませんでしたが、同じアドレスで書き込めてしまいました。 だいぶおしいところまで来てる感じがします。 $formatの形態は以下(★1)のようになってます。 #--データを整形--# $state = "$street<>$title"; $age = "$age_y<>$age_m<>$age_d<>$noage"; ★1→$format = "$no,$name,$mail,$age,$state,$comment,$hoop,$risou,$max,$date$time,$H_A,$m_pass\n"; これを教わったように当てはめてみたら、こんな感じでした。 以下で宜しいのでしょうか?まず、男性からテストしています。 ↓↓↓↓ この上は「データを一行にする」というのがあります。 #--パスワードを暗号化--# $m_pass = crypt($pass, "xx"); if ($title eq "") { $title = "無 題"; } if ($in{'noage'} eq "1") { $noage = "1"; } else { $noage = "0"; } &lock1; if ($sex eq "0") { if (!open(IN,"$mensfile")) { &lock2; &error("$mensfile ファイルオープンエラー"); } } elsif ($sex eq "1") { if (!open(IN,"$ladysfile")) { &lock2; &error("$ladysfile ファイルオープンエラー"); } } $line = <IN>; ($r0,$r1,$r2,$r3,$r4,$r5,$r6,$r7,$r8,$r9,$r10,$r11) = split(/\,/, $line); #--二重投稿チェック--# if ($r1 eq "$name" && $r4 eq "$street<>$title" && $r5 eq "$comment") { &lock2; &error("二重投稿は禁止です!"); } #--男性ログファイル--# open(IN,"$mensfile") || &error("Open Error: $mensfile"); local(@file) = <IN>; close(IN); #--メールアドレスの重複チェック--# foreach (@file) { local($no,$name,$mail,) = split(/<>/); #★1 if ($mail eq $eml) { &error("このメールアドレスは既に登録済です"); } #★2 } # 女性ログファイル にも同様の処理をする(以下略) #--最新の記事ナンバーをつける--# $r0++; $no = "$r0"; close(IN); #--データを整形--# $state = "$street<>$title"; $age = "$age_y<>$age_m<>$age_d<>$noage"; $format = "$no,$name,$mail,$age,$state,$comment,$hoop,$risou,$max,$date$time,$H_A,$m_pass\n"; #--男性の場合の登録処理--# if ($sex eq "0") { &mens_read("lock2"); $num = unshift(@DATA, $format); if ($num > $maxlog) { pop @DATA; } if (!open(OUT,">$mensfile")) { &lock2; &error("$mensfile ファイルオープンエラー"); } print OUT @DATA; close(OUT); } #--女性の場合の登録処理--# elsif ($sex eq "1") { &ladys_read("lock2"); $num = unshift(@DATA, $format); if ($num > $maxlog) { pop @DATA; } if (!open(OUT,">$ladysfile")) { &lock2; &error("$ladysfile ファイルオープンエラー"); } print OUT @DATA; close(OUT); } &lock2; この下は管理者へのメール送信をカスタマイズして入れて成功しています。 もう少しだっという手ごたえが・・ 本当に詳しい説明に感謝です。宜しくお願い致します。