質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

199閲覧

「再送信をします。」という二重送信エラー表示が出てしまいます

kazu_jc

総合スコア18

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/10/02 03:33

編集2018/10/02 03:47

下記のようにしてスコアランキングを作成して、html(.php)に表示させるようにしました。
問題はpost送信ボタンでスコアを送信した後に、一旦 ./record.txt にスコアが記録されます。それをphpページでスコア反映を表示させようとして、リロードすると、画像のような「再送信をします。」という二重送信エラー表示が出てしまいます。
「再試行」ボタンを押してリロードしても”,,2018/10/02-12:15”というスコアを
./record.txtに送っているようなのでスコアランキングに問題はないのですが、
エラー表示を出さないようにする方法はありますか?
(ちなみに、get送信をすると同じ記録が2個ランキングに載ってしまうので
余計良くありません)

宜しくお願い致します。

<!DOCTYPE html> <html lang="ja"> <head> ・・・・ </head> <body>

・・・・

<p9>名前/ニックネーム</p9> <div class=send_data> <form action="" method="POST"> <p><input type="text" name="nickname" maxlength="8" size="13"></p> <input type="hidden" name="score" value="" id="score"> <p><input type="submit" value="記録送信"></p> </form> </div>

・・・・

<div class="content4"> <p11>score name time<br></p11> <?php // CSV ファイルを読み込み、$data配列に格納 $handle = fopen("./record.txt", "r"); while (($row = fgetcsv($handle, 1000, ",")) !== FALSE) { if ( $row[0] > 0 ) { $data[] = array( 'score'=>$row[0] ,'nickname'=>$row[1], 's_date'=>$row[2], ); } } fclose($handle); // 列方向の配列を得る foreach ($data as $key => $row) { $score[$key] = $row['score']; $user[$key] = $row['nickname']; $s_date[$key] = $row['s_date']; } // データを スコアの昇順にソートする array_multisort($score, SORT_ASC, $user, SORT_DESC, $s_date, SORT_ASC, $data); // 結果を10件表示 for( $i=0 ; $i<15 ; $i++ ) { print "$score[$i] $user[$i] $s_date[$i] <br>\n"; } ?> </div>
<script>   // phpにてスコア保存 <?php $score=$_POST['score']; $user=$_POST['nickname']; $s_date=date( "Y/m/d-H:i", time()); $text=$score.",".$user.",".$s_date."\n"; //log.txtにスコアを保存 $fp = fopen("./record.txt", "a"); fwrite($fp, $text); fclose($fp); ?> ・・・・・ </script> </body> </html>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

表示も書き込みも掲載されたコードで行っているのですよね?
これだと、以下の部分が表示時も実行されるので、よけいなデータが書き込まれませんか?
POST された際には書き込むけど、それ以外の時には書き込まない、、といった制御からまず考えた方が良いかと思いますが。。。

php

1$fp = fopen("./record.txt", "a"); 2fwrite($fp, $text); 3fclose($fp);

そうすると、再送信の問題ももう少し考えやすくなります。
もしくは、別の方が書かれているように、表示と書き込みとで明確にコード(URL)を分ける、というのも1つの方法です。

投稿2018/10/02 04:15

ssasaki

総合スコア1167

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

最初の画面(=結果を表示するページ)と、
POSTされた値を処理してスコアを保存する画面
を別のURLにして、POSTされた値を処理後に302リダイレクトなどで最初の画面(=結果を表示するページ)に飛ばせばよいのでは。

投稿2018/10/02 03:50

kunai

総合スコア5405

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazu_jc

2018/10/02 04:16

papinianusさんへの回答と同じになります。
kunai

2018/10/02 04:27

いや、だから同一画面でいいんですよ。 POSTを処理するときだけ別URLにして、表示される画面は最初の画面になる。 302リダイレクトがなにかご存知ですか?
kazu_jc

2018/10/02 04:31

なるほど。そういうことですか。。申し訳ないのですが、そこら辺の基礎的知識が無く(^^;
kazu_jc

2018/10/02 04:45 編集

ちなみに、test.phpというところにゲームがありますが、送信ボタンを押したら、homeページに移動する、という考え方なら良いかと思って、 <form action="" method="POST"> <form action="http://…/index.html" method="POST"> としてみたのですが、こんどはスコアをPOSTを処理する前にホームに行ってしまい。。 POSTされた値を処理してスコアを保存する画面は/record.txt になりますが、それが使えますでしょうか?
kunai

2018/10/02 04:51

えーっと、POSTされた値を処理している部分を別のファイルにするわけです。 ```PHP #record.php <?php $score=$_POST['score']; $user=$_POST['nickname']; $s_date=date( "Y/m/d-H:i", time()); $text=$score.",".$user.",".$s_date."\n"; //log.txtにスコアを保存 $fp = fopen("./record.txt", "a"); fwrite($fp, $text); fclose($fp); header('Location: http://・・・/test.php', true, 302); ``` で、POSTするactionはこのURLにする ```PHP #test.php <form action="record.php" method="POST"> ```
kazu_jc

2018/10/02 05:11

できましたーー!! 餅は餅屋ですね。yah**知恵袋とは、レベルが違う(^^; 皆さまありがとうございました。m(._.)m
guest

0

  • 先に登録してランキングを出す。
  • ランキング表示時にデータをマージする

などとするとそもそも再送しなくて良くなるのでは?

用途によっては結果ページは別ページがよいかもしれません

それともどうしても2回送信したいという質問でしょうか?

投稿2018/10/02 04:07

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazu_jc

2018/10/02 04:17

小さなゲームのインターフェースなので、スコアランキングは同一ページに表示したいのです。。「そもそも再送しなくて」→ <p><input type="submit" value="記録送信"></p> が不要ということでしょうか?phpはほとんど素人で他のソースを張り付けて来た感じなので、(^^;大変すみません。
kazu_jc

2018/10/02 04:18

スコアはベストスコアが出たときにのみ、送信するようになっております。 それで記録送信ボタンがあるのです。
papinianus

2018/10/02 07:10

解決済みですが、将来参照するかたもいらっしゃるかもしれないので。 質問では、処理の流れとして、1. ランキング表示(ファイル読み込み)、2. 記録(ファイル書き込み)という順ですが、逆順でやれば、記録したものを直後にランキングとして出せるように感じました(理解が浅いかもしれないですが)。 そうすれば「ランキングを反映させるための*再*送」は不要じゃないでしょうか? 当然ながら、最初の送信は必要です。
kazu_jc

2018/10/17 07:14

遅れました。 ご回答、参考に致します。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問