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

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

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

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

Q&A

解決済

2回答

16770閲覧

掲示板の作成においてリロードしたら同じ投稿がされるのを防ぎたい

fdaf_11111

総合スコア16

PHP

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

0グッド

1クリップ

投稿2016/11/22 22:12

名前、タイトル、本文を投稿することができる掲示板を作成しました。投稿に関してはなんの問題もありません。しかし、投稿が成功したあとに更新ボタンをおすとおなじ投稿が投稿されてしまいます。(タイトルや本文にはなにも入力していなくてもです)なぜこのようなことがおきるのでしょうか。よろしくお願いします。

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>board</title> </head> <body> <form method="post" action="guestbook.php"> Name: <input name="name"><br> Title: <input name="title"><br> <textarea name="contents" cols="60" rows="5"></textarea> <input type="submit" name="write" value="送信"> </form> <hr> <?php $contents = $_POST['contents']; $rows=array(); if($contents && $_POST['write']) { $contents = htmlspecialchars($contents); $contents = str_replace("\n", "<br>", $contents); $contents = $contents . "\n"; $row=array( 'name' =>$_POST['name'], 'title' =>$_POST['title'], 'time'=>date("Y/m/d H:i;s"), 'contents' =>$_POST['contents'] ); $fp = fopen('guestbook.txt', 'a'); fputs($fp,$row["name"].":".$row["title"].":".$row["time"].":".$row["contents"]."\n"); fclose($fp); $lines = file('guestbook.txt'); foreach ($lines as $key => $line) { $tmp=explode(":", $line); $arr=array( "name"=>$tmp[0], "title"=>$tmp[1], "time"=>$tmp[2], "contents"=>$tmp[3] ); $arrs[]=$arr; } foreach ($arrs as $arr) { echo "name: ". $arr["name"]."<br>"; echo "title: ". $arr["title"]."<br>"; echo "time: ". $arr["time"]."<br>"; echo "contents: ". $arr["contents"]."<br>"; print "\n<hr>\n"; } } ?> </body> </html>

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

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

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

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

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

guest

回答2

0

ベストアンサー

POSTしたページをF5(ページの更新)しているのでPOST処理自体をもう一度実行してしまいます。
よって以下で回避できます。

  1. POSTでアクセスされたときのみ投稿内容をファイルに出力する処理をする。
  2. POSTでアクセスされファイルに出力した後に自分自身にリダイレクトしてGETでアクセスさせる。

※icchiiさんの回答を見て気づいたので修正。html出力場所を移動

PHP

1<?php 2if($_SERVER["REQUEST_METHOD"] == "POST"){ 3 $contents = $_POST['contents']; 4 $rows=array(); 5 if($contents && $_POST['write']) { 6 $contents = htmlspecialchars($contents); 7 $contents = str_replace("\n", "<br>", $contents); 8 $contents = $contents . "\n"; 9 $row=array( 10 'name' =>$_POST['name'], 11 'title' =>$_POST['title'], 12 'time'=>date("Y/m/d H:i;s"), 13 'contents' =>$_POST['contents'] 14 ); 15 16 17 $fp = fopen('guestbook.txt', 'a'); 18 fputs($fp,$row["name"].":".$row["title"].":".$row["time"].":".$row["contents"]."\n"); 19 fclose($fp); 20 21 header('Location: ' . $_SERVER[SCRIPT_NAME]); 22 exit; 23 } 24} 25?> 26<!DOCTYPE html> 27<html lang="ja"> 28・・・略・・・ 29<hr> 30<?php 31$lines = file('guestbook.txt'); 32・・・略・・・

投稿2016/11/22 22:32

編集2016/11/22 22:43
Y.H.

総合スコア7914

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

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

fdaf_11111

2016/11/23 09:48 編集

ありがとうございます。ちなみに「F5すると直前の動作を実行する」理由は更新機能がそういう仕組になっているからなのでしょうか?
Y.H.

2016/11/23 12:37

はい
guest

0

書き込み処理の後に、強制的に自分自身にリダイレクトすると更新時の重複投稿を防げます。
リロードすることでPOST処理のあとにGET処理が動くので、更新するとGETが再実行されるようになるためです。
参考:【PHP】PHPでリロード対策をして二重投稿を防止しよう

なお、header関数は、HTMLの出力するまえに実行する必要があるため、処理順を少し変える必要があります。参考に軽くやってみたコードを記載しておきます。

php

1<?php 2// 送信ボタンが押されたら、最初に書き込みを行い自分自身にリダイレクトする 3if(isset($_POST['write'])) { 4 5 $contents = htmlspecialchars($contents); 6 $contents = str_replace("\n", "<br>", $contents); 7 $contents = $contents . "\n"; 8 $row=array( 9 'name' =>$_POST['name'], 10 'title' =>$_POST['title'], 11 'time'=>date("Y/m/d H:i;s"), 12 'contents' =>$_POST['contents'] 13 ); 14 15 16 $fp = fopen('guestbook.txt', 'a'); 17 fputs($fp,$row["name"].":".$row["title"].":".$row["time"].":".$row["contents"]."\n"); 18 fclose($fp); 19 20 header('Location: guestbook.php'); 21 exit; 22} 23?> 24<!DOCTYPE html> 25<html lang="ja"> 26<head> 27<meta charset="utf-8"> 28<title>board</title> 29</head> 30<body> 31<form method="post" action="guestbook.php"> 32 Name: <input name="name"><br> 33 Title: <input name="title"><br> 34 <textarea name="contents" cols="60" rows="5"></textarea> 35 <input type="submit" name="write" value="送信"> 36</form> 37<hr> 38<?php 39$lines = file('guestbook.txt'); 40foreach ($lines as $key => $line) { 41 $tmp=explode(":", $line); 42 $arr=array( 43 "name"=>$tmp[0], 44 "title"=>$tmp[1], 45 "time"=>$tmp[2], 46 "contents"=>$tmp[3] 47 48 ); 49 $arrs[]=$arr; 50} 51foreach ($arrs as $arr) { 52 echo "name: ". $arr["name"]."<br>"; 53 echo "title: ". $arr["title"]."<br>"; 54 echo "time: ". $arr["time"]."<br>"; 55 echo "contents: ". $arr["contents"]."<br>"; 56 57 print "\n<hr>\n"; 58 59} 60 61?>

投稿2016/11/22 22:35

popobot

総合スコア6586

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問