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

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

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

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

3143閲覧

PHPで掲示板を設置したが、ページを再読み込みすると、投稿への返信が勝手に増えていく

abuuu1203

総合スコア20

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2015/11/08 08:11

編集2015/11/08 08:12

lang

1<?php 2 3(略) 4== 関数 function 5function readLog($FILE){ 6 $log = array(); 7 if(!($file = fopen($FILE, "r"))) { 8 return; 9 } 10 flock($file, LOCK_SH); 11 for($i = 0 ; !feof($file) ; $i++) { 12 $log[$i] = rtrim(fgets($file), "\n"); 13 } 14 flock($file, LOCK_UN); 15 fclose($file); 16 if($log[count($log) - 1] === "") { 17 array_pop($log); 18 } 19 return $log; 20} 21function writeLog($file, $log, $max) { 22 foreach($_POST as $key => $value) { 23 $_POST[$key] = mb_convert_encoding($_POST[$key], "UTF-8", "auto"); 24 $_POST[$key] = preg_replace("/&/", "&amp;", $_POST[$key]); 25 $_POST[$key] = preg_replace("/</", "&lt;", $_POST[$key]); 26 $_POST[$key] = preg_replace("/>/", "$gt;", $_POST[$key]); 27 $_POST[$key] = preg_replace("/\s*\x0D\x0A\s*/", "<br>", $_POST[$key]); 28 $_POST[$key] = preg_replace("/\s+/", " ", $_POST[$key]); 29 } 30 $tm = date("U"); 31 $data = join("\t", array($tm, $_POST['name'], $_POST['title'], $_POST['gender'], $_POST['text'], $_POST['admincomment'])); 32 33 array_unshift($log, $data); 34 while(count($log) > $max) { 35 array_pop($log); 36 } 37 if(!($file = fopen($file, "w"))) { 38 return; 39 } 40 flock($file, LOCK_EX); 41 fputs($file, join("\n", $log)); 42 flock($file, LOCK_UN); 43 fclose($file); 44 return $log; 45} 46function deleteLog($FILE, $log) { 47 array_splice($log, $_POST['key'], 1); 48 if(!($file = fopen($FILE, "w"))) { 49 return; 50 } 51 flock($file, LOCK_EX); 52 fputs($file, join("\n", $log)); 53 flock($file, LOCK_UN); 54 fclose($file); 55 return $log; 56} 57function postAdminLog($FILE, $log) { 58 $log[$_POST['key']] .= ' ' . $_POST['admincomment'] . '<br />'; 59 60 $log = array($_POST['key'] => $log[$_POST['key']]) + $log; 61 62 //$tmp = $log[$_POST['key']]; 63 //unset($log[$_POST['key']]); 64 //$log = array_unshift_assoc($log, $_POST['key'], $tmp); 65 66 if(!($file = fopen($FILE, "w"))) { 67 return; 68 } 69 flock($file, LOCK_EX); 70 fputs($file, join("\n", $log)); 71 flock($file, LOCK_UN); 72 fclose($file); 73 return $log; 74} 75function printLog($log, $view) { 76 $page = $_GET['page']; 77 $start = $page * $view; 78 $end = $start + $view; 79 $count = count($log); 80 if($end > $count) { 81 $end = $count; 82 } 83 84 for($i = $start ; $i < $end ; $i++) { 85 if(!preg_match("/\t/", $log[$i])){ 86 continue; 87 } 88 89 list($tm, $name, $title, $gender, $text, $admincomment) = explode("\t", $log[$i]); 90 91 $tm = getdate($tm); 92 $tm = sprintf("%02d/%02d %02d:%02d", $tm[mon], $tm[mday], $tm[hours], $tm[minutes]); 93 if(!$name) { 94 $name = "名無し(no name)"; 95 } 96 if(!$title) { 97 $title = "無題(no title)"; 98 } 99 echo '<div class="small-12 columns">'; 100 echo "<hr />\n"; 101 printf("<input type=\"radio\" name=\"key\" value=\"%0d\">", $i); 102 echo "【 $title 】$name - $gender<br>"; 103 echo "<p>". $text . "</p>"; 104 echo "<h3>管理人からの返信: </h3>"; 105 echo "<p>". $admincomment. "</p>"; 106 echo '<br />'; 107 echo "<div align=\"right\">$tm</div>"; 108 echo "</div>"; 109 } 110 echo "<center>\n"; 111 if($page > 0) { 112 printf("<a href=\"%s?page=%d\">≪前ページ</a>\n", $_SERVER['SCRIPT_NAME'], $page - 1); 113 } 114 if($end < $count) { 115 printf("<a href=\"%s?page=%d\">次ページ≫</a>\n", $_SERVER['SCRIPT_NAME'], $page + 1); 116 } 117 echo "</center>\n"; 118} 119 120function array_unshift_assoc(&$arr, $key, $val) 121{ 122 $arr = array_reverse($arr, true); 123 $arr[$key] = $val; 124 return array_reverse($arr, true); 125} 126 127//================================================ メインプログラム main program 128?> 129 130<html> 131<html lang = "ja"> 132<meta charset = "UTF-8"> 133<head> 134 <title>BBS</title> 135 <font size = "4" color = "white"> 136 137 (略) 138<body bgcolor="black"> 139 <div class="row bbs-page"> 140 <div class="small-12 columns"> 141 <h1 style="margin:2px;text-align:center;font-size:15px;letter-spacing:10px">来店予約掲示板</h1> 142 <hr> 143 <?php 144 $log = readLog($FILE); 145 if($_POST['mode'] === "write") { 146 if($_POST['text'] !== "" 147 and $_POST['name'] !== "" 148 and strlen($_POST['text']) <= $TEXTMAX * 2 149 and strlen($_POST['name']) <= $NAMEMAX * 2 150 and ($_POST['gender']) ) { 151 $log = writeLog($FILE, $log, $MAX); 152 }else{ 153 echo '<p class="text-center" style="color:red;">未入力の項目があります。ご確認ください。</p>'; 154 } 155 } 156 elseif($_POST['mode'] === "edit") { 157 if($_POST['pass'] === $PASSWORD) { 158 if($_POST['submitcomment']){ 159 $log = postAdminLog($FILE, $log); 160 }elseif($_POST['delete']){ 161 $log = deleteLog($FILE, $log); 162 } 163 } 164 } 165 ?> 166 <form class="margin-bottom bbs-form" action="<?=$_SERVER['SCRIPT_NAME']?>" method="POST"> 167 <div class="small-12 medium-6 columns"> 168 題名 (title):<input type="text" name="title" size="50" required="true" maxlength="<?=$TITLEMAX?>"> 169 </div> 170 <div class="small-12 medium-6 columns"> 171 名前 (name):<input type="text" name="name" size="50" required="true" maxlength="<?=$NAMEMAX?>"> 172 </div> 173 <div class="small-12 columns"> 174 性別 (Gender):<br></br> 175 <input required="true" type="radio" name="gender" value="男性">男性 176 <input required="true" type="radio" name="gender" value="女性">女性 177 <input required="true" type="radio" name="gender" value="カップル">カップル 178 </div> 179 <div class="small-12 columns"> 180 本文 (content): <small>※全角<?=$TEXTMAX?>文字以内</small><br> 181 <textarea required="true" name="text" rows="10" cols="80"></textarea><br> 182 </div> 183 <div class="small-6 columns float-left"> 184 <input type="hidden" name="mode" value="write"> 185 <input class="" type="submit" value=" 書き込み (post) "> 186 </div> 187 </form> 188 <div class="small-12 columns margin-bottom"> 189 <form action="<?=$_SERVER['SCRIPT_NAME']?>" method="POST"> 190 <?php 191 printLog($log, $VIEW); 192 ?> 193 <hr> 194 <div class="small-12 columns"> 195 <h2 class="uppsercase">管理者専用フォーム</h2> 196 </div> 197 <div class=""> 198 <p class="text-left">管理者のコメント:</p> 199 <textarea class="margin-bottom" name="admincomment" rows="10" cols="80"></textarea> 200 <div class="row"> 201 <div class="small-12 columns"> 202 <p>管理者用パスワードを入力してください。</p> 203 </div> 204 <div class="small-12 medium-6 columns"> 205 <input type="password" name="pass"> 206 </div> 207 <div class="small-12 medium-6 columns"> 208 <input type="hidden" name="mode" value="edit"> 209 <div class="small-8 columns"> 210 <input type="submit" name="submitcomment" value="管理者コメントを送信"> 211 </div> 212 <div class="small-4 columns"> 213 <input type="submit" name="delete" value="削除"> 214 </div> 215 </div> 216 </div> 217 </div> 218 </form> 219 </div> 220 </div> 221 </div> 222</body> 223</html>

掲示板を設置し、テストしていたら、管理者からの投稿への返信がページを再読み込みするたびに、勝手に増殖していきます。
上のコードですが、多分、sortの問題で、トップソートをした時に、関数が配列全てsortしてしまっているからではないか、と考えております。
データベースは不要です。
DATファイルに保存しています。
この問題が解決されないと全く無関係な投稿に全く関係ない返信が何個もいってしまい、見るに堪えない状態になってしまうことが明確です。
ご指導よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

リロードでデータが増えてしまうのは
リロード=再度同じデータをPOSTする
ということから、実装通りに動いているという状態に見えます。

検索キーワードとしては
PHP 二重POST
あたりでしょうか。

参考URL

一番簡単な解決方法としては

1.フォームの送信先を自分自身では無く、書き込み専用のページにする
2.書き込み専用のページでは、書き込みが正常に終了したら、header()関数によって表示ページにリダイレクトさせるようにする
だと思います。

仕組みとしては
2.の時点でフォーム内容のPOSTとは別のHTTPリクエストが成立するので、表示ページへのアクセスに$_POSTの値は含まれなくなり、リロードしても問題が無くなります。

投稿2015/11/08 08:32

tanat

総合スコア18713

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

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

abuuu1203

2015/11/09 09:52

お返事ありがとうございます。 ちなみに、この方法はデータベースに保存しないPHPでも可能なものなのでしょうか? 検索したら、このようなコードが出てきたので、どう調整しようか迷ってます。 いかんせん、データファイルに保存されるようにしておりますので。。。 ご指導ください。 <?php // header()でリダイレクトするので // どんな出力よりも先に行う。 if($_POST['submit']) { /* 処理 */ header("Location: {$_SERVER['PHP_SELF']}"); exit; } ?> <form method="post" action="<?php print($_SERVER['PHP_SELF']); ?>"> <input type=text name=aaa> <input type="submit" name="submit" value="submit"> </form>
tanat

2015/11/09 10:06

データベースは単なる保存先なので、 データベースでもdatファイルでも今回の件(リロードによってデータが多重登録される)とは関係ありません。 提示されているソースも殆どそのまま適用可能だと思います。 ソースがどの様に動くか考えながら調整してみて下さい。
abuuu1203

2015/11/10 10:10

ありがとうございます!! おかげさまで解決することができました。 ちなみに、大変お手数だとは思うのですが、上のコード中で、admincommentという配列があります。 これをechoする際に、文字色を変えて表示したいのですが、どこにどんなコードを追加すればよろしいのでしょうか? 自分ではechoのあとの””の中に、<font color = "blue">のように追加してみたのですが、エラーが出てしまいます。 ご指導お願いいたします。
tanat

2015/11/10 13:08

fontタグで行うならblueの前後をシングルクォートにして、直前のpタグと同じダブルクォートの中に入れれば出来ると思います。 fontタグ自体がすでに否推奨なので、直前のpタグにクラスを指定して、cssで制御するのがスマートではありますが、そこは別途cssの学習をするタイミングで出来れば良いのかなとも思います
abuuu1203

2015/11/10 16:23 編集

追記の質問なのにご丁寧に回答してくださり、ありがとうございます。 HTMLとCSSは一通りできるので、試してみます。 どちらかと言うと、PHPの方が、初めてあまり時間の立っていないものですので、CSSでも十分制御できるということを想定できませんでした。 これで全て解決しそうです。 どうもありがとうございます。
abuuu1203

2015/11/10 17:24

大変申し訳ないのですが、まだ質問がありまして、ここで続けるのはずるいのかな、と思って新しい質問を書こうとしたのですが、何故か文字数オーバーじゃないのにエラーが出まして、投稿できませんでした。 もしよろしければ、質問をもう少しだけ追記させていただいてもよろしいでしょうか? 大変身勝手なお願いでもう強い訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問