• ベストアンサー

Perl 2重投稿の防止

http://unimakura.jp/php/not-double-post.html このサイトはPHPとしての参考がかかれていますが、 このようなことを、Perlでしたいのですが、どう記述すればいいのでしょうか?? 完了画面での、フォーム再送信を禁止にしたいです。

  • Perl
  • 回答数6
  • ありがとう数6

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

  • ベストアンサー
回答No.6

> をしてみましたが上手くいきませんでした。 どう上手く行かなかったのかです。  InternalServerErrorなら、エラーログはどう記録されているのか  真っ白い画面なら、ソースHTML表示でどう記述されているのか  ブラウザのURL表示は転送URLにはなったが、それがNot found表示なのか 等々の次第で原因と対策は変わります。

perlhogehoge
質問者

お礼

原因がわかりました! いままで print "Content-type:text/html\n\n"; sub xxxxx{ headerやfooter,endformなど } とサブルーチン外に書いていたのを サブルーチン内に書くとそのページで更新しても 2重投稿はなくなりました! ありがとうございました!

その他の回答 (5)

回答No.5

> print "Content-type:text/html\n\n"; これが この後はHTMLですよと宣言しているヘッダなので、 後方で print "Location:~\n\n"を入れてても 転送されずに、HTMLの 一部として表示されてしまう原因です。 なので、これを削除する必要があります。 > を消すとページは表示されなくなりますし BBSへの書き込み完了のメッセージページを表示しないで 別のURLへ転送することを、狙っての修正なのですから、 それで正解です。 転送したあとが表示できないなら、転送先の指定が悪いか 転送先のページ自体の問題です。

perlhogehoge
質問者

お礼

print "Content-type:text/html\n\n"; を消してしまうと、 ページそのものが見えなくなります。 試しに、print "Content-type:text/html\n\n"; より前に、 sub endform{ print "Location: URL\n\n"; exit; 1; } をしてみましたが上手くいきませんでした。 bbs.cgi側------------------------ require "bbscommon.pl"; use warnings; use Encode; use CGI; my $form = new CGI; if($form->param('send')){&printdata($log = $log);} printdata = 書込処理の中にendformへ移動する「&endform」 があります。

回答No.4

> print "Location:bbs.cgi\n\n"; > 双方を試したのですが、文字がでてくるだけで、 > 更新すると2重投稿になってしまうのですが、 ブラウザにLocation:~が表示されるということですね。 ヘッダとしてLocation:~ を出す必要がありますが、 この前のどこかで、別のヘッダ出力やデバック用でprintしていると、 Location:~が、ヘッダ扱いでなくHTML扱いになってしまいます。 printしていないか確認してみましょう。

perlhogehoge
質問者

お礼

そういうことですか・・・ ただデバック用というのが、いまいちピンとこないのですが、 現在 bbs.cgi bbscommon.pl の2つがあり bbscommon.plには print "Content-type:text/html\n\n"; これは入っており bbscommon.plの方にsub endformがあります。 他にもこのファイルにはページHTMLの部分 書込フォームであったりエラーフォーム、headerfooter などが入っております。 bbs.cgiは基本的に書込処理や削除処理、ページ表示(for)などです。 この場合 print "Content-type:text/html\n\n"; を消すとページは表示されなくなりますし、 どのように対処するのでしょうか? #!/usr/bin/perl print "Location: https://www.yahoo.co.jp/\n\n"; exit; 1; これだけ、別のファイルにするのでしょうか? ただこれで、書込処理後にprint "location: URL"; ですると、これまたブラウザで表示されてしまいます。 bbs.cgi側にはContent-type:text/html\n\n"; これは、ないのですが、 おそらく デバック用でprintということなのですが、これがよくわからないです。。。

回答No.3

> 現在、こんな風にしているのですが、 > また違うのですか?・・・ 一応 投稿後に別ページに飛ばして そこでリロードしても二重投稿しないように対策はやってるってことなんですね。 ただこれだと "完了"が出ている間に リロードすると 二重投稿してしまうはずです。 また ヘッダーでのlocation転送ではないのでブラウザのバックボタンで戻ると二重投稿になってしまうのではないでしょうか? 完了メッセージのsub endformの内容を単独のCGIにしといて &endform;のかわりに print "Location:その.cgi\n\n"; にするか 完了メッセージがなくてよいのなら &endform;のかわりに print "Location:bbs.cgi\n\n"; とするか して試して見てはどうでしょう。 あと 別件ですが submitボタンをダブルクリックして2発目からは キャンセルされるJavaScriptを入れたほうがよいかも です。

perlhogehoge
質問者

お礼

ありがとうございます! print "Location:bbs.cgi\n\n"; 双方を試したのですが、文字がでてくるだけで、 更新すると2重投稿になってしまうのですが、 単純にテストで下記のソースだけで試すと、リダイレクト されるのですが、 サブルーチン側に問題があるのでしょうか? #!/usr/bin/perl print "Location: https://www.yahoo.co.jp/\n\n"; exit; 1;

回答No.2

参考サイトの通りのことをperlで行うなら、 CGI::Session.pmを使ってセッション管理することになり、 PHPのように簡単には、行かないですね。 またこのやり方のままだと、セッション変数名が固定なので ブラウザで投稿画面を2つ開いて、別々の投稿をするということができないので、 問い合わせフォームなら問題ないでしょうけど、 BBSやブログには向かないように思えます。 (例えばBBSならスレッド番号+投稿番号をセッション変数にするなどの工夫が必要かと) もしくは、リロードでの多重投稿防止だけ考えるなら もっと簡単に、CGIで投稿処理と、完了画面を分けてしまう方法もあります。 具体的には フォームからのsumit ↓ 投稿処理CGI  ~画面表示はしないで、ファイルの更新処理のみ~  最後に print "Location:http://{完了画面のURL}\n\n"; ↓ 完了画面 これで完了画面をリロードしたりバックボタンで戻っても投稿処理は繰り返されしませんので。

perlhogehoge
質問者

お礼

ご回答ありがとうございます。 if($form->param('send')){&send();} ↑書込処理で これの最後に &endform として、 sub endform{ print <<END; <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=$CHARSET"> <title>完了</title> <script language="JavaScript"> <!-- mnt = 0.5; url = "bbs.cgi"; function jumpPage() { location.href = url; } setTimeout("jumpPage()",mnt*1000) //--> </script> </head> <body> 完了 ※自動で戻ります。戻らない場合は下記の「戻る」をクリック<br> <input type="button" value=" 戻る " height:30px" onclick="location.href='bbs.cgi"> </body> </html> END exit; 1; } 現在、こんな風にしているのですが、 また違うのですか?・・・

  • t_ohta
  • ベストアンサー率38% (5076/13261)
回答No.1

投稿を受付るプログラムで処理後にHTMLを出力するのでは無く、受付完了ページへリダイレクトを掛けるようにすればリロードの問題は解決します。

perlhogehoge
質問者

お礼

ご回答ありがとうございます。 もしよろしければ、もう少し具体的に教えていただけませんか? もしくは、参考のサイトを教えてほしいです;;

関連するQ&A

  • Perlのフォームパラメータの受け取り方、モジュールのコンパイルなど

    PHPではフォームのパラメータは $kosuu = $_POST['kosuu']で取得できますが、Perlでは一般的にどのように受け取るのでしょうか? PHPは理解しやすい(方法が1つ)ですがPerlはいろいろとできそうで、誰が見てもわかるor信頼性が高い記述方法が知りたいです。 また、WindowsのActivePerlを使っているのですが、CPANでモジュール?をインストールする場合は、VisualC++6のインストールが必須でしょうか? BoarlandC++5.5無料をインストールして、モジュールのコンパイルをしたいのですが可能でしょうか?

    • ベストアンサー
    • Perl
  • PHPでメール入力画面→送信完了画面を作りたい

    質問失礼します。 HPのメールフォーム作成に取り組んでいて、 メール入力画面→送信完了画面を作成したいです。 HTML,CSSの知識はあるのですが、 PHPの知識が全くなく調べながら作っています。 現状、送信用HTMLとphpファイルを使って、 HTMLファイルで入力した内容をメールアドレスまで飛ばすところまでは作成できました。 長くなるので簡易的に下に記述します。 【sendmail.php】 <?php mb_send_mail("メールアドレス","件名","$_POST["body"]","ヘッダー") ?> 【html】 <html> <form method="POST" action="sendmail.php"> <textarea name="body"></textarea> <input type="submit" value="送信"> </form> </html> 【動作】 入力画面で任意に内容を入力し、送信をクリック→真っ白の画面(メールアドレスに内容が届く) という状態です。 真っ白の画面を送信完了画面として表示するには、 【sendmail.php】ファイルに直接htmlを記述していくのが、 一般的な方法なのでしょうか。 いろいろと調べているのですが、どの方法が一般的で一番いい方法なのかを 探している段階です。 どなたかアドバイスをお願いします。 (確認画面、エラー画面は、現段階では抜きで、 とりあえず送信画面→送信完了画面を作りたいです。)

    • 締切済み
    • PHP
  • PHPでメールフォームを作るのは一般的なのですか?

    サイトでメールフォームや掲示板を作りたいと思い、CGI(Perl)の本を買って読んでみたのですが、C言語を少しやっていた私としてはPerlの記述が少々身に合わないと思いました。 そこで、PHPでも同じようにメールフォームや掲示板というのは一般的に使われているのでしょうか?勉強する上でPerlでメールフォームや掲示板という参考書はたくさんあったのですが、私の通っている本屋ではPHPでそのような本がありませんでした。 いずれデータベースもやりたいと思い、またC言語っぽいPHPのほうが勉強しやすいと思い、PHPでメールフォームなどを作りたいのですが、Perlとの違いや注意点などありますか? またお勧めのPHPの書籍やサイトを教えてください。よろしくお願いします。

    • ベストアンサー
    • PHP
  • ダブルクォート、シングルクォート、\について

    こんにちは。 PHPでメールフォームを作ったのですが、2つ問題点があります。 1.テキストフィールドにダブルクォートで文字を囲んで送信すると入力された情報が返されず、何も入力されていないメールが送られてきます。 2.シングルクォート、\をいれると前に\がついてしまいます。(こんなカンジ→\'\\)フォームはHTMLで作成しています。確認画面のフォームにstripcslashes($_POST[name])をかけておりブラウザ上だとシングルクォートと\は除去されているのですが、メールだと除去されてません。 ダブルクォート、シングルクォート、\が付いた文字列をPHP・HTMLにどのように記述すれば、メールにきちんと送られるようになるのでしょうか?

    • 締切済み
    • PHP
  • XAMPPでPerlを

    Movable Typeをローカルでテストしたいと考え、 http://likealunatic.jp/2007/06/04_xampp_mt.php を参考にXAMPPを入れたのですが、Perlが使えません。 (他のサイトも色々調べたのですが解決できませんでした) どなたかアドバイスお願いします。 状況は・・・ 1.XAMPPとPerlアドオンをインストールしました。 2.CGIファイルの関連付けをしました。 3.apacheの設定で#ScriptInterpreterSource registry の#を外しました。 ※4.XAMPPのステータス画面で[Perlが停止]になってしまっています。 ※5.localhost/mtでMTにログインしようとすると[Error 500]が返ってきます。 ※不明・不足な点は追加で記入していきます。

  • PHP5.3での括弧について

    PHP5.3では、PHPを記述する際に使用する括弧を<?php~?>にしなければならないのでしょうか。 http://www.ajaxmail.jp/ というサイトで配布されているPHPスクリプトに、 <?= $key ?> という記述があり、テスト送信するとフォームの中身ではなくそれがそのままメールに送信されてしまいます。 これを回避する方法はあるのでしょうか。 それとも、5.3の仕様なのでしょうか。

    • ベストアンサー
    • PHP
  • phpとperlでメールフォーム+DB登録機能

    phpとperlでメールフォーム+DB登録機能を作っていますが、 だいぶ煮詰まってしまいました。 ●設計概要 https://dl.dropbox.com/u/85274673/form.jpg ●参考にしたが解決しなかったURLの一部掲載 http://okwave.jp/qa/q3086758.html http://ml.php.gr.jp/pipermail/php-users/2003-October/019138.html ●使用しているsend.cgi(配布フリー) http://www.synck.com/contents/download/cgi-perl/mailformpro.html ●状況 cgi(perl)もしくはphpだけでdb登録+メール送信両方行うプログラムが 必要となりました。 php単体でdb登録+mb_send_mailをスクラッチで書いてうまくいったと思ったのですが、 ユーザー側に送るメール内容(本文)と管理者側に送るメール内容(本文)を 分けることができず、現状使っているsend.cgiでメール送信し、phpでDBに登録 はできないかと思い、調べながらやってみました。 (cgi(perl)はphp以上に完全素人なので、dbへの登録を行うプログラムが書けませんでした。) form.html→db.php→thanks.html from.html→send.cgi→thanks.html は問題なく動作しました。 設計の通り 1. form.html→db.php→send.cgi→thanks.html もしくは 2. from.html→send.cgi→db.php→→thanks.html を実現したいと思っています。 $_POSTの値さえ渡せれば 1.は実現できそうなのですが、話はそう単純ではないのでしょうか。 ヒントでも貰えれば幸いです。宜しくお願いいたします。

    • ベストアンサー
    • Perl
  • フォームデータの取得。どこに格納されている?

    Perlからの乗り換え者です。 データベースとの連携が非常に楽なので詳しく勉強したいのですが、参考書が少ないので悪戦苦闘してます。 Perlではフォームの送信データは環境変数QUERY_STRINGやSTDINで取得することができますが、PHPの場合はどうやって取得するのでしょうか? PHPでも特定の環境変数に格納されているのですか? また、Perlのcgi-lib、ReadParseのような技もあるのでしょうか? 参考書のサンプルを見ても当たり前のようにさっと書いてあるだけで、どこがデータ取得の記述か分かりません。 たぶん質問No.146も同じようなことを質問されているような気がするのですが、私の場合、それ以前のもっと基本的な問題のようです。 GETの場合とPOSTの場合、両方教えていただけると助かります。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • postの文字化け防止について

    POSTメソッドについて質問させていただきます。 WEBページはPHPで記述しています。 よろしくお願いします。 $name='田中一郎'; $req->addPostData("username", $name); 上記のようにPOSTでデータを送信すると 受け取った側のページで文字化けしてしまいます。 $nameの内容をEUC-JPで送信したいのですが、 個別に文字コードを指定することは可能でしょうか。 環境は、PHP 5.2.17です。 確認に使用しているブラウザはGoogle Chromeがメインでサブはfirefoxです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPスクリプトでperlスクリプト

    はじめまして。PHP初心者です。助け舟をお願いします。 PHPスクリプトで、formの表示からデータの受け取り→ファイルに書込み→終了画面の表示ができるスクリプトを書くことが出来ました。 これをphpスクリプト1とします。 POSTで受け取った変数を元に処理した変数を返すperlスクリプトがあります。 これをperlスクリプト1とします。 perlスクリプト1をphpスクリプトにすることは私には困難なため、phpスクリプト1のファイルに書き込む前に、perlスクリプト1を実行→返った変数をphpスクリプトで使用しファイルに書込み→終了画面の表示を行いたいです。 こんなことってできますか?

    • 締切済み
    • PHP

専門家に質問してみよう