フォームから入力された文字列をデータファイルの中から検索し、重複していなければ追加登録したい。
・問題点
重複していても登録できてしまう。
昨日から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知恵袋で同様の質問をしましたが、
回答者への個別のコメントや追加質問が出来ず、
非常に使いづらく感じたのでこちらに投稿させて頂きました。
No.1ベストアンサー
- 回答日時:
> while($line=<IN>){
<> (ダイヤモンド演算子) では、改行コードも含めて入力されます。
よって、
$line = "でーた\n"
としたような状態になっています。
$data にはformから入力したので、改行コードは付いていません。
これでは絶対に一致しません。
while($line=<IN>){
chomp $line ;
if ( $line eq $data ) {
$flag = 1;
}
}
という感じに、chomp関数を使うなど、改行コードを削除するのが,Perlでの常套手段です。
あとは、細かいことになりますが
> open(IN , "<:uft8" , "data.dat");
戻り値を確認して、エラーのときは、適切な処理をするようにしましょう。
> open(OUT,">>data.dat");
INでは3引数で使ってるのですから、OUTの方も3引数使っては?
エラー処理も入れましょう。
ただ、このままだと、同時にアクセスがあったときに、不具合が発生する可能性があります。
「perl 排他制御」で検索して、調べてください。
今回の場合だったら
'+<' で読み書き用でopen→flock等の排他処理→読み込み→(closeはしない)→seekで末尾に→追記→close
というのが常套手段でしょう。
> print "Content-Type: text/html; charset=UTF-8\n";
> print "$data $pr<br>\n";
HTTPのヘッダは、空行で区切りです。\nで改行するなら、\n\nと改行だけの行が必要です。
その後もHTMLとしては変ですが、それはとりあえず置いておきます
色々とご指摘ありがとうございました。勉強になりました。
重複登録も無事に判別できるようになり解決しました。
次は検索のプログラムを頑張ってみようと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- PHP PHP MySQLに画像を直接保存 2 2022/06/05 11:50
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perlで特定行から特定行までを...
-
window.open でのファイル指定方法
-
VBAでCSVファイルの特定行を書...
-
ReadLineでの読み出し行を指定する
-
awkスクリプトでダブルクォーテ...
-
VBAで巨大なファイルの途中から...
-
ExcelをCSV書き出す場合のシー...
-
VBAでCSVファイルを途中行まで...
-
htaccessで特定のディレクトリ...
-
fopenでディレクトリ内の全ファ...
-
ファイル出力の改行コードをLFに
-
エクセルVBAで素数だけを出力す...
-
fgets で値が取得できない
-
エクセルVBA コードが同じでも...
-
配列の中に重複文字列があるか...
-
DOSコマンドで、標準出力を出力...
-
MATLABのm-fileについて
-
openした後、closeしないでプロ...
-
WindowsでPerlをする際,1行目の...
-
バッチファイルの作り方(CSV→...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perlで特定行から特定行までを...
-
Perlの初心者です。2重ループ...
-
perlでcsvファイルを読む(ダブ...
-
Argument "\\\\n" isn't numeri...
-
perlにてスペースの削除に苦労...
-
Perl初心者です。同一データを...
-
ファイルの3行目までを出力したい
-
先頭の単語が一致した時のデー...
-
Java CSVファイルをカンマごと...
-
FTP接続時失敗時、接続先名をcs...
-
データファイルからのデータの...
-
MATLAB std::exceptionエラー
-
cgiのログの書き方
-
エラーチェック、ファイルに特...
-
Perlで空白行を削除
-
perl:パターンマッチを使ったif...
-
CSVファイルのデータの行数を取...
-
外部ファイルからの指定行と指...
-
コマンド上の行間
-
perlでファイルの比較
おすすめ情報