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("/&/", "&", $_POST[$key]); 25 $_POST[$key] = preg_replace("/</", "<", $_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ファイルに保存しています。
この問題が解決されないと全く無関係な投稿に全く関係ない返信が何個もいってしまい、見るに堪えない状態になってしまうことが明確です。
ご指導よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/11/09 09:52
2015/11/09 10:06
2015/11/10 10:10
2015/11/10 13:08
2015/11/10 16:23 編集
2015/11/10 17:24
2015/11/10 19:29