• ベストアンサー

リロードで再び書き込まれてしまう

掲示板で、投稿後にリロードすると さっき投稿した内容が再び書き込まれてしまいます。 これを防ぐには、open OUT で書き込みをして close OUT をした後に、SOPTデータを消す記述を 書けばいいんだと思います。 その記述を教えて下さい。

  • A__
  • お礼率59% (194/328)
  • CGI
  • 回答数2
  • ありがとう数8

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

  • ベストアンサー
  • ttk
  • ベストアンサー率33% (1/3)
回答No.1

SOPTデータの意味が分かりませんが。。 > open OUT > close OUT 一瞬何かと思いました。ファイルハンドルだったんですね。 普通にファイルを開いて、閉じてとか書いた方がいいですよ。 > 掲示板で、投稿後にリロードすると > さっき投稿した内容が再び書き込まれてしまいます。 良くありますね。 書き込み処理が終わったら、 print "Location: 掲示板のURL\n\n"; とするのを自分では良く使います。

A__
質問者

お礼

ありがとうございます。 Location: で別ページ飛ばす方法もありますよね。 でも、それをせずに、bbs.cgi で送信して bbs.cgi に飛ばす方法で、さっきの送信した POST の情報を消すことはできませんか? $|=1; とか close; とか書いてみたけど、 それをすると bbs.cgi でHTMLが表示されなくなって うまくいきませんでした。

その他の回答 (1)

  • rokujiro
  • ベストアンサー率53% (17/32)
回答No.2

全然参考にならないかも知れませんが一応書き込みます。 まず、何故リロードすると二重書き込みになるかって事ですがリロード事態が ブラウザが前回行ったことを再度実行すると言う事ですので書き込みの内容を 覚えているブラウザが再び同じ処理を行い書き込みをしてしまいます。 防ぐ方法としてはCGIでは無くMETAタグで勝手にブラウザに書き込み以外の処理を させれば良い訳です..... 書き込み完了画面を作成しヘッド内に下記の記述をすればOK!? <head> <base target="_self"> <title>JUMP</title> <meta HTTP-EQUIV="Refresh" CONTENT="0;URL=http://********"> </head> こうすればブラウザが勝手に次の処理を行いリロードしても二重書き込みが防げるはずです。

A__
質問者

お礼

ありがとうございます。 METAタグの方法をやってみたけど、できませんでした。 リロードで再び書き込まれました。

関連するQ&A

  • アクセスカウンタでリロード時のカウントされるのをやめたい!

    自分のPCでIIS5.0をインストールして CGIの作成練習をしています。 簡単なアクセスカウンタを作ったのですが、 どっかのをコピーしただけ。。。 sub counter{ #(読込み) open (IN,"<./count.dat"); $raikyaku = <IN>; close (IN); $raikyaku++; #(書き込み) open (OUT,">./count.dat"); print OUT $raikyaku; close (OUT); } これを、更新ボタンを押した時にカウントされない ようにしたいです。 また、BBSに埋め込もうと思っているので、 投稿ボタンで再表示された場合も カウントされてほしくありません。

  • リロードすると、何度も書き込まれる

    htmlのフォームに書き込まれた内容をログファイルに保存してCGIで表示する(しょぼしょぼな掲示板or日記みたいなやつ) というのを勉強しています。 上記の事はうまくいきました。 でもCGIへ表示したあと、リロードボタンを押すと、最後(最新)に書き込んだ内容が追加書き込みされてしまいます。 うまく説明できないのですが、掲示板で言うなら「お前何回も同じ事書き込むなよー」っていう感じになります。 これを回避するプログラムを追加するために、私が次に勉強するべき事は何でしょうか? 自分でも、何をどう質問していいのかわからなかったのですが、にっちもさっちもいかないのできてみました。 Cookieについて勉強するがよい とかでいいので、何か教えて下さい(^^; もう少し情報が必要でしたら、補足要請下さい。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • ダンガンロンパ1・2リロードについて

    ダンガンロンパリロードにあるスクールモードというのをやりたいのですが、私はvitaを持っていません。 ダンガンロンパ1はプレイ動画を全て見て、2はpspの方でクリアしてしまいました。 ダンガンロンパ1も自分でクリアしたくなり後で買おうと思っていたのですが... 調べてみたらリロードの方だとコロシアイの起きないスクールモードというのがあるのを知りました。 とてもやりたいのですが、今からvitaとリロードを買うのには少し抵抗があります。 そこでなのですが、リロードを購入された方に質問があります。 1の内容を知っていて尚且つ2の方をプレイした後なのですが、vitaとリロードを買っても損はしないでしょうか? 正直ほとんどスクールモードのために買うようなものなのですが...スクールモードはどのような感じなのでしょうか。アイランドモードと同じとは聞いているのですが、買って損はしない内容でしょうか。 乱文で申し訳ありません、ご回答宜しくお願いします。

  • phpで掲示板

    phpで掲示板を作り、入力、投稿、データの表示はうまくいくのですが、リロードによる連投ができてしまうのですが、 入力、投稿が終わってデータベースに書き込んだ後にunset($_POST)で投稿内容を破棄しようとしてますが、変わらず連投できてしまいます。 なにか方法としてよいものはありますか? (入力、投稿、データの表示は全て同じベージです。)

    • ベストアンサー
    • PHP
  • PHPのリロード時の処理

    PHPのリロード時の処理 PHPプログラム初心者です。 掲示板のプログラムを作成しております。 以下のコードで、リロード時、自動で投稿ボタンが押されてsubmitしてしまいます。 自分で考えた解決策としては、下記のwriteDate()内で、条件を入れることです。 $_GET['personal_name'];のデータを変数に保持し、次にリロードされた時同じものが返ってきら、writeDate()内の処理をしないという方法です。 このときの変数の保存の仕方が解りません。 ご存じの方がおられましたら教えてください。 <?php if($_SERVER["REQUEST_METHOD"]=="GET"){ writeData(); } readData(); function readData(){ $keijban_file='keijiban.txt'; $fp=fopen($keijban_file,'rb'); if($fp){ if(flock($fp,LOCK_SH)){ while(!feof($fp)){ $buffer=fgets($fp); print($buffer); } flock($fp,LOCK_UN); }else{ print('ファイルロックに失敗しました'); } } fclose($fp); } function writeData(){ //--------ここで同じ書き込みデータがあればreturnしたい。------- $t=$_GET['personal_name']; $personal_name=$_GET['personal_name']; $contents=$_GET['contents']; $contents=nl2br($contents); $data="<hr>\r\n"; $data=$data."<p>[投稿者:".$personal_name."]</p>"; $data=$data."[内容]"; $data=$data."<p>".$contents."</p>"; $keijban_file='keijiban.txt'; $fp=fopen($keijban_file,'ab'); if($fp){ if(flock($fp,LOCK_EX)){ if(fwrite($fp,$data)===FALSE){ print('ファイル書き込みに失敗しました'); } flock($fp,LOCK_UN); }else{ print('ファイルロックに失敗しました'); } } $data=null; fclose($fp); } ?>

    • ベストアンサー
    • PHP
  • ファイルopenについて

    1----------------------------------- open(IN,">$past_file")|| &error; @lines2=<IN>; close(IN); >は書き込みopenということですが、この使い方で一応読み込みはできます。しかしやはり使い方としては間違っているのでしょうか?OSによってはできないとか・・ というのも、ないファイルをOPENするとき、読み込みではファイルはopenできませんよね。書き込みでopenすれば、ないファイルを自動で作成してくれます。今作っている掲示板だとこれは都合がいいので、こういう風に記述したいのですがだめでしょうか。

    • ベストアンサー
    • Perl
  • 文字化け対策

    sjisで保存されたファイルを読み込んで、別ファイルに書込みを行ったところ、能等の文字が文字化けを起こしました。 open(IN,"$file"); my $data = <IN>; close(IN); $data=~s/\\//g; open(OUT,">$file2"); print OUT $data; close(OUT); 莫大なソース量だったので、原因を探すのに時間がかかりましたが、一つ一つ消去しながら探したところ、 $data=~s/\\//g; これを消すことで解消しました。 文字化けさせずに\を消すにはどのように書けばいいのでしょうか?

    • ベストアンサー
    • Perl
  • 配列の一部を書き換えてファイルに保存する方法は?

    $dicname ='GermJ.txt'; open(IN, "$dicname"); @list = <IN>; close(IN); 読み込んだ配列@listの5番目のデータを'aaaaaaaaaa'に書き換えたいのですが、 $list[5]='aaaaaaaaaaaaaaaaa'; open(OUT, "> $dicname"); foreach (@list) { print OUT $_; } close(OUT); とやって、ファイルの中身を調べると、6番目の文字列データが5番目の文字列データの後ろにくっついてしまっています。 改行マークを $list[5]='aaaaaaaaaaaaaaaaa',\n;のように行末に追加しても、次の行とのあいだに空間が生まれます。基本的なファイル書き込みの知識をお尋ねして申し訳ありませんが,どうかお教えください。

    • ベストアンサー
    • Perl
  • cgiでポーリングして取得したデータが変化していた時のみHTMLをリロードする方法

    Perlのカテゴリで質問したところ(質問番号:5634620)、JavaScriptで実現 できるかもしれないとのアドバイスを頂いたので、こちらで質問します。 次のことをするcgiを作りたいのですが  1. cgiを起動したらある装置からデータを読み込んできて配列及びファイルに   書き込み、その内容を表(HTML)に表示。(即時)  2. 5秒ごとに装置に対してデータを読みに行き(ポーリング)、変化があったら   (セーブしてあるデータと読みに行ったデータに違いがあったら)表(HTML)を    リロードして新しいデータの内容を表示する。 perlのカテゴリで下記のようなアドバイスを頂きましたが、 Javascriptは全くわからず、お手上げ状態です。 >Ajaxを使えばできそうな気がします。 >setInterval(checkData,5000); >として5秒毎に、checkData関数を呼び出します。 >checkData関数内では、Ajaxを使ってサーバーのデータを読み込み、現在の >データと照合し、更新していれば、 >location.reload(true); >として、リロードさせます。 実際にどの様に記述すれば実現可能か、教えていただけませんでしょうか。 よろしくお願い致します。

  • リロードせずにHPの表示を変える

    JavaScript超初心者です。 リロードせずにHPの表示を変えるのはどのようにすれば行えるのでしょうか? 例えば、下記のAppleのホームページでは * 概要 * スペック比較 * ギャラリー * 製品保証規定、のところをクリックするとリロードする事なくHP内容が切り替わります。 http://store.apple.com/jp/browse/home/shop_mac/family/mac_mini?mco=MTI5MTI AppleのHPに限らずこのようなHPをたびたび見かけますが、方法が知りたく質問書き込みさせていただきました。 このようなHPの作り方やその方法が解説されているサイトなどご存じありましたら、書き込みをいただけたらと思います。 よろしくお願いします。

専門家に質問してみよう