削除機能つき掲示板
本日は削除機能のついた掲示板。削除の大まかな考え方は書き込みがあったら各要素をタブ区切りで分け、1行ずつ保存する↓行に番号を付与し、記事番号とする↓書き込まれたデータはログファイルの先頭に書き込む↓削除ボタンが押され、削除キーが合っていたらたらログファイル内からその行を削除ソースはこちら↓<?php// ログファイルの内容を一行ずつ$linesに格納$lines = file('bbs2.txt');// 書き込みボタンが押されて、POSTデータのwriteを受け取ったらif($_POST['write']){ // $linesの1行目をタブ区切りに分け、$itemsに格納 $items = explode("\t",$lines[0]); // ログの先頭行を+1して最新記事番号を$noにセット $no = $items[0] + 1; // 名前を取得 $name = htmlspecialchars($_POST['name']); // 名前が空欄の時は"名無しさん" if(!$name) $name = "名無しさん"; // メールを取得 $mail = htmlspecialchars($_POST['mail']); // タイトルを取得 $title = htmlspecialchars($_POST['title']); // タイトルが空欄の時は"無題" if(!$title) $title = "無題"; $contents = htmlspecialchars($_POST['contents']); $contents = str_replace("\r\n","<br>",$contents); $contents = str_replace("\r","<br>",$contents); $contents = str_replace("\n","<br>",$contents); // 削除キーをセット $delkey = htmlspecialchars($_POST['delkey']); $time = date("Y/m/d H:i:s"); // 有効期限に設定するための時間を変数に格納 // ここではtime関数で現在時刻を取得し、それに30日分を秒数で加えている $expire = time() + 3600 * 24 * 30; // setcookie関数でクッキーをセット // setcookie(A,B,C); // A → クッキーの名前 // B → 値 // C → 有効期限 // 名前・マルアド・有効期限をクッキーにセットし、30日間有効にする setcookie("name",$name,$expire); setcookie("mail",$mail,$expire); setcookie("delkey",$delkey,$expire); // 新しく'bbs2.txt'に追加する一行を$dataにセット $data = "$no\t$name\t$mail\t$title\t$contents\t$delkey\t$time\n"; // ログファイルの先頭に今回の書き込みを格納 // array_unshift(A, B) // Aの最初にBを追加する array_unshift($lines, $data);} else { // 書き込みモードでない場合、クッキーの値から名前・メルアド・削除キーを取り出して変数に格納する。 $name = $_COOKIE['name']; $mail = $_COOKIE['mail']; $delkey = $_COOKIE['delkey'];}// 記事削除ボタンが押されたらPOST変数に delete が入るので、その場合は以下の削除処理を行う。if ($_POST['delete']){ // ログファイルの内容を行数の分だけループで調べ for ($i = 0; $i < count($lines); $i++) { // ログファイル内の現在行のデータから各項目の値を $items に格納 $items = explode("\t",$lines[$i]); // $items[0]には記事番号、$items[5]には削除キーがそれぞれ格納されている。 // 記事番号・削除キーともにフォームから送られてきた値と等しければ if ($items[0] == $_POST['delno'] && $items[5] == $_POST['delkey2']){ // ログファイルの配列から一行削除 // array_splice(A,B,C); // A → 削除対象の配列 // B → 削除開始位置 // C → 削除要素数 array_splice($lines, $i, 1); } }}// 書き込み・削除が行われログ内容が変更された時にはログを書き込んでいますif ($_POST['write'] || $_POST['delete']) { // bbs2.txt を書き込みモードで開き代入 $fp = fopen('bbs2.txt', "w"); // $linesの内容を$lineに格納し、$fpに追加 foreach($lines as $line) fputs($fp, $line); // $fpを閉じる fclose($fp);}?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html lang="ja"><head><meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"><title>掲示板その2</title></head><body><!--フォームの初期値として、上で取得したクッキーの値をセット--><form method="post" action="bbs2.php">お名前:<input type="text" name="name" value="<?php print $name ?>" size="40"><br>メール:<input type="text" name="mail" value="<?php print $mail ?>" size="40"><br>題 名:<input type="text" name="title" size="60"><br>削除キー:<input type="password" name="delkey" value="<?php print $delkey ?>" size="10"><br><textarea name="contents" cols="60" rows="5"></textarea><br><input type="submit" name="write" value="送信"><hr>記事番号:<input type="text" name="delno" size="10">削除キー:<input type="password" name="delkey2" size="10"><input type="submit" name="delete" value="記事削除"></form><hr><?php// 記事表示部分foreach($lines as $line) { // rtrim()で文字列の最後から空白を削除する $line = rtrim($line); // explode(A, B) // AでBを分割する。ここでは配列 $line をタブで分割し、$itemsに格納 // [0]記事番号、[1]名前、[2]メルアド、[3]タイトル、[4]投稿内容、[5]削除キー、[6]書き込んだ時間 $items = explode("\t",$line); print "NO.{$items[0]} "; print "<b>{$items[3]}</b>"; print " 投稿者:"; // もしメルアドに入力があったらメールのリンクを作成 if ($items[2]) print "<a href='mailto:{$items[2]}'>"; print $items[1]; if ($items[2]) print "</a>"; // 投稿時間を表示 print " 投稿時間:{$items[6]}"; // 投稿内容を表示 print "<p>{$items[4]}</p><hr>\n";}?></body></html>サンプル画面はこちら