- ベストアンサー
データを書き換えたいのですが・・・
以下の方法で、CGIを書いたのですが、ユーザーIDを入れても、データベースを書き換えられません。 どこが問題なのか、教えて頂きたく質問しました。 *何分初心者で、見づらいと思いますが、宜しく御願いします。 ★目的 ユーザIDを入れると、”hanteinasi”の人が”hanteiari”にデータベースに書き換えられる。 ★データベース ○ユーザID:名前:メール:性別:年齢:(判定ありorなし):認証ID: 例)kk432 : 佐藤 : j@co.jp : 男 : 20 : hanteinasi : q1234 : ★CGI #!/usr/local/bin/perl require 'cgi-lib.pl'; &ReadParse(*form); require 'jcode.pl'; &jcode'convert(*form, 'sjis'); open(ENQ,"+<enquete.dat") || die "File 'enquete.dat' Open Error."; @add= <ENQ>; $i=0; chop @add;; foreach (@add){ ($userID, $name, $mail, $sex, $age, $hantei, $ninsyouID )=split(/:/, $_); if( $form{'user'} eq $userID && $hantei eq "hanteinasi"){ $hantei= "hanteiari"; @add[$i]; = "$userID:$name:$mail:$sex:$age:$hantei:$ninsyouID:\n"; i++; flock(ENQ, 2); print ENQ @add[$i]; flock(ENQ, 8); } elsif($hantei eq "singuru" || $hantei eq "hanteinasi"){ @add[$i] = "$userID:$name:$mail:$sex:$age:$hantei:ninsyouID:\n"; i++; flock(ENQ, 2); print ENQ @add[$i]; flock(ENQ, 8);}} close(ENQ); # -----ここから出力 ----- print "Content-type:text/html\n\n"; print << "END_OF_HTML"; <HTML><HEAD><TITLE>登録完了</TITLE></HEAD> <BODY><CENTER><FONT color="red"> 登録完了 </FONT></CENTER></BODY></HTML> END_OF_HTML}EOF
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
がると申します。 いくつか基本的な部分を。 @add[$i]; = "$userID:$name:$mail:$sex:$age:$hantei:$ninsyouID:\n"; 配列に添え字をつけて直接アクセスをする場合は $add[$i]; = "$userID:$name:$mail:$sex:$age:$hantei:$ninsyouID:\n"; と記述したほうがよろしいかと思います。 また、ファイルの書き込みを見ていると… ・flockの場所が好ましくない もしLOCKが必要であれば、openの直後にすべきです。 ・flockの解除はしない flock(ENQ, 8) ですが、closeでロックが解除されるので、これは「やってはいけない」です(やらなくてもよい、ではなくてやってはいけない、です)。 ・ファイルポインタの操作をしていないので、データが常に「追加で記述されている」。 恐らくenquete.datをダウンロードしてテキストエディタなどで見られるとわかると思うのですが。ファイルの後ろのほうにどんどん追加されていってしまっていると思われます。 とりあえず、ファイル操作周りについてもうちょっと学ばれることをお勧めいたします。
その他の回答 (1)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#1の方の指摘以外で、 単なる転記ミスなのかもしれませんが i++; は、 $i++; かと あとninsyouIDも$ninsyouIDなのかな
お礼
ご回答有難う御座います。しっかりチェックしなければ・・・。 どうも有難う御座いました。
お礼
ご回答有難う御座います。大変参考になりました。確かに、データがどんどん追加されていました。要勉強ですね。どんどん勉強していきたいと思います。 有難う御座いました!!