投稿番号、投稿削除と投稿修正機能

このQ&Aのポイント
  • PHPを使用して掲示板に投稿番号、投稿削除、投稿修正機能を追加する方法について教えてください。
  • 投稿番号を付けたい場合は、投稿データをファイルに保存し、ファイルに書き込む際に投稿番号を付加します。
  • 投稿削除と投稿修正機能の実装は、投稿データを読み込んで編集し、再度ファイルに書き込むことで行います。
回答を見る
  • ベストアンサー

投稿番号、投稿削除と投稿修正機能

こんにちわ。今、PHPのみで掲示板の機能の一つである、投稿番号(投稿記事に番号をふりたい)と投稿者自身が投稿を削除する(削除キーを使用して8文字以内とかにしようかと)機能と投稿者が投稿を修正できる機能を作成したいと思っているのですが、なにか簡単な例でいいですので記述していただけないでしょうか?削除キーはテキストボックスで作りました。webのサンプルソースをみても組み込めないでいます。だいぶ、省略していますが、下記のようになスクリプトを組んでいます。 // ファイル書き込み  $file = fopen("data.txt", "w"); fwrite($file, "$name\t$mail\t$body\t$dt\n".implode("", $data)); $i = 1; foreach ($data as $value) { if($i < 100) { fwrite($file, "$value"); $i++; } } fclose($file); header("Location:subject03-02.php"); exit; } //投稿表示 $data = file("data.txt"); $i = 1; foreach($data as $value){ $view = explode("\t", $value); list($name, $mail, $body, $dt) = explode("\t",$value); if( $i < 11 ){ if($mail== ""){ echo "お名前:$view[0]$view[3]<br>"; echo "本文:$view[2]<br>"; echo '<hr size="1" width="80%"><br>'; } else { echo "お名前:<a href=\"mailto:$mail\">$view[0]</a>$view[3]<br>"; echo "本文:$view[2]<br>"; echo '<hr size="1" width="80%"><br>'; } } $i++; }

  • msnxl
  • お礼率81% (36/44)
  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#18096
noname#18096
回答No.1

以下の記事からの続きですね。 OKWave ファイル書き込みが重複する http://okwave.jp/kotaeru.php3?q=2211674&rev=1 私とkaiwareponさんの掲示したソースを取り込まれたようですが、一部に無駄な箇所があります。 他人のソースを取り込むときには、どのような仕組みで動作しているかきちんと理解してから、取り込んでください。 場当たり的にソースを取り込むと、ソースが大きくなって不具合が出たときに、どこに原因があるか調べるのが困難になります。 私が他人のソースを参考にする時には、以下のサイトをよく利用します。 PHP: Hypertext Preprocessor http://jp2.php.net/ PHP: PHP マニュアル - Manual http://jp2.php.net/manual/ja/index.php ページ上部のテキストボックスに関数名を記入して検索すれば、関数についての説明が出てきます。 関数は基本的に functionname(); という書式なので、使用したことがない関数らしきものがあれば、検索して調べてください。 例えば、implode("", $data) が解らなければ、"implode" で検索すれば、説明が出てきます。 以下、無駄な箇所について。 まず、初めにごめんなさい。前回、私は勘違いしていました。 if($i < 100) { fwrite($file, "$value"); $i++; } } 私は上記ソースの代わりに配列を操作して、implode("", $data) で書き込むロジックを考えていました。 (書き込みは最初の一度で終わる、と言うことです) で、代替手段として、array_shift($data) implode("", $data) を用意しましたが、これは誤りでした。 (これは必要な動作ですが、100行に制限するロジックではありません) 1行目は、恐らくヘッダ情報なんですよね? その場合、implode("", $data) で書き込むときには、以下のような100行に制限するロジックを追加する必要があります。 while(count($data) > 100){ // 既存データが100以上だったとき array_pop($data); // 配列の最後の要素を除去 } これで先のfor文は不要となります。 $view = explode("\t", $value); list($name, $mail, $body, $dt) = explode("\t",$value); どちらか一方で良いので、一方が無駄です。 私が紹介した下例は、「変数の名前が解りやすい方が良かろう」という配慮からで上例でも何ら問題はありません。 本題の記事編集ですが、便宜上、私の紹介した方で説明します。 list($name, $mail, $body, $dt) = explode("\t",$value); $value が1つの記事データを表すとすれば、これで各データ値が初期化されます。 次に、それをフォーム上に出力します。 echo "<form action='edit.php'>..."; ユーザーは次に、edit.php に編集データをポストします。 各投稿データが $name, $mail, $body, $dt, $item_num に代入されるとして。($item_num は記事No.を表します) $data = file("data.txt"); // 既存データ読み込み foreach($data as $val){ list($name_tmp, $mail_tmp, $body_tmp, $dt_tmp, $item_num_tmp) = explode("\t",$val); if($item_num == $item_num_tmp){ // 記事No.が合致したとき $val = "$name\t$mail\t$body\t$dt\t$item_num\n"; // 編集済みデータの初期化 break; } } 繰り返しですが、これもソースをそのまま取り込みではなく、内容を理解されてから使用して下さい。 (最も、必要な処理のみを記述しているので、変数名等、書き直さなければならない部分があるでしょう。) 現状のままだと、矢継ぎ早な質問から収集がつかなくなることは必至だと思います。

msnxl
質問者

お礼

ありがとうございます。なんとか削除機能を実装することができました。

msnxl
質問者

補足

丁寧なご指導ありがとうございます。ご忠告を踏まえた上で取り組みます。

関連するQ&A

  • 投稿記事を論理削除2

    PHPで掲示板の機能の一つである論理削除機能を作成しようと思っています。削除キーに削除パスワードを入力,投稿番号を指示したときに投稿者の記事を削除(物理削除ではありません)するようにしたいのです。スクリプトの一部を記述します。全文は補足に記述させていただきます。削除パスワードの送り方、そのパスワードかを確認、投稿番号の指示の仕方などお教えいただけないでしょうか? 流れ的には記事を書くときに、削除キーに削除パスワードを入力、 投稿を送信したあとに、投稿番号を指示して削除キーに入力した 削除パスワードを入力、削除ボタンを押して投稿を削除としたいのです。 $data = file("data.txt"); $i = 1; foreach($data as $value){ $view = explode("\t", $value); list($name, $mail, $body, $dt) = explode("\t",$value); if( $i < 11 ){ if($mail== ""){ # 削除ボタンが押されたら if($submit =="削除"){ $submit = $_POST["delete"]; } #このパスワードなら if($_delkey == "0123456789"){ $_POST["num"]; } if ( $num == $view[3] && $pass == "0123456789"){ } echo "お名前:$view[0]$view[3]<br>"; echo "本文:$view[2]<br>"; echo '<hr size="1" width="80%"><br>'; } else { echo "お名前:<a href=\"mailto:$mail\">$view[0]</a>$view[3]<br>"; echo "本文:$view[2]<br>"; echo '<hr size="1" width="80%"><br>'; } } $i++; }

    • ベストアンサー
    • PHP
  • ファイル書き込みが重複する

    こんばんわです。 以下のスクリプトで 投稿データを時系列に新しい書込み順に表示させようとしているのですが、一度実行させると同じ投稿がいくつも表示されてしまうのです。ご回答お願いいたします。一部省略しています。 <?php if($name== "" or $body == ""){ echo '<font color = "#FF000">必須項目入力エラー</font><br>'; echo 'お名前と本文は必ず入力してください<br>'; echo '<a href = "javascript:history.back()">戻る</a>'; } $body = substr($body, 0, 1000); $body = str_replace("\r\n", "<br>", $body); $dt = date("y/m/d H:i:s"); $data = file("data.txt"); $file = fopen("data.txt", "w"); fwrite($file, "$name\t$mail\t$body\t$dt\n"); $i = 1; foreach ($data as $value) { if($i < 30) { fwrite($file, "$value"); $i++; } } fclose($file); } echo ' subject03-BBS <h1>subject-BBS</h1> <form method="post" action="subject03.php" > お名前 <input type="text" size="20" maxlength="40" name="NAME"> メール <input type="text" size="30" maxlength="60" name="MAIL"> <p>本文<br></p> <textarea rows="20" cols="80" wrap="soft" name="BODY"></textarea> <p><input type="submit" name="SUBMIT" value="送信"><p/> </form> '; $data = file("data.txt"); foreach($data as $value){ $view = explode("\t",$value); if($mail== ""){ echo "お名前:$name$view[3]<br>"; } else{ echo "お名前:<a href=\"mailto:$mail\">$name</a>$view[3]<br>";} echo "本文:$body<br>"; } ?>

    • ベストアンサー
    • PHP
  • ファイルに記憶できない。

    こんにちわお聞きしたいのですが、以下のスクリプトで、送信で引渡されたデータを先に記録し、再度ファイルから取出し表示したいのですが data.txtに書き込まれないです。サーバーに上げている、data.txtの の属性は書き込みにしています。 <?php $submit = $_post["submit"]; if($submit == "送信"){ $name = $_POST["NAME"]; $mail = $_POST["MAIL"]; $body = $_POST["BODY"]; if($name== "" or $body == ""){ echo '<font color = "#FF000">必須項目入力エラー</font><br>'; echo 'お名前と本文は必ず入力してください<br>'; echo '<a href = "javascript:history.back()">戻る</a>'; exit; } $body = str_replace("\r\n", "<br>", $body); $fp = fopen("data.txt","w"); fwrite($fp,"$name\t$mail\t$body\n"); fclose($fp); } echo ' subject03-BBS <h1>subject-BBS</h1> <form method="post" action="subject03.php" > お名前 <input type="text" size="20" maxlength="40" name="NAME"> メール <input type="text" size="30" maxlength="60" name="MAIL"> <p>本文<br></p> <textarea rows="20" cols="80" wrap="soft" name="BODY"></textarea> <p><input type="submit" name="SUBMIT" value="送信"><p/> </form> '; $data = file("data.txt"); foreach($data as $value){ $view = explode("\t".$value); $name = $view[0]; $mail = $view[1]; $body = $view[2]; if($mail== ""){ echo "お名前:$name<br>"; } else{ echo "お名前:<a href=\"mailto:$mail\">$name</a><br>";} echo "本文:$body<br>"; } ?> </body> </html>

    • ベストアンサー
    • PHP
  • テキストデータから指定行の削除

    phpでサイトを作っています。 テキストデータを一行ずつ表示させ、指定した行を削除したいのですが、どうすればいいのでしょうか? -- data.txt -- aaa,data1, bbb,data1, ccc,data1, ddd,data1, -- php -- <?php $del=$_POST['del_no']; if($del!=""){ $data_all = file("data.txt"); for($i=0;$i<count($data_all);$i++){ $data_array = explode(",",$data_all[$i]); if($data_array[0]!=$del){//削除データ以外を再書き込み $txt="$data_array[0],$data_array[1],\n"; $fp = fopen("data.txt", "w"); flock($fp,1); foreach ($txt as $line) {// 1行ずつファイルへ書き込み? fwrite($fp, $line); } fclose($fp); break; } } } ?> <b>data list</b> <? $data_all = file("data.txt"); for($i=0;$i<count($data_all);$i++){ $data_array = explode(",",$data_all[$i]); echo "$data_array [0]<br />"; echo "<form method=\"post\">"; <input type=\"hidden\"name=\"del_no\" value=\"$data_array[0]\" />";//削除するデータをPOST echo "<input type=\"submit\" value=\"削除\" />"; echo "</form>"; } ?> こうすると、テキストデータが白紙になってしまいます。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 投稿記事のページ表示

    こんにちわ。ページ処理で苦悩しています。 掲示板で五件以上投稿されたとき「次の五件へ」のボタンを押したときに過去の五件の投稿が表示されるようにしたいのです。 最初に投稿されたとき5件だけを表示するというとはできるのですが、 ページ移動の処理(ページ移動したとき過去の投稿の5件が表示されている)がわからないのです。 掲示板の書き込み処理と、次の「五件へ」の途中スクリプトを のせさせていただきます。 書き込み処理 $file = fopen("data.txt", "w"); fwrite($file, "$name\t$mail\t$body\t$dt\t$count\t$flag\t$text\t\n".implode("", $data)); fclose($file); 「次の5件へ」が押されたら過去の投稿が5件表示されるという処理作成している途中です。 if($submit == "次の5件へ"){ echo "<form method=\"post\" action=\"subject03-02.php\" >"; echo "<input type=hidden name=pline value=$view[4]>"; echo "<input type=submit value=次の五件へ>\n"; echo "</form>\n"; } 表示スクリプトは省いています。

    • ベストアンサー
    • PHP
  • ラジオボタンのチェックの付け方。

    sizen.csvというファイルがあります。 中身は ----- umi,海 yama,山 mizuumi,湖 ike,池 mura,村 ----- です。 このcsvファイルをsizen.phpに読込んで ラジオボタン使用の設問を作りたいと思っております。 プログラムは・・・ <form action="area.php" method="POST"> <?php $file=file("sizen.csv"); for($i=0;$file[$i];$i++){ $data=explode(",",$file[$i]); echo"<input type='radio' name='sizen' value='".$data[0]."'>"; echo"$data[1]<br>"; } ?> <input type="submit" value="次へ"> とできたのですが、チェックがついていません。 先頭にチェックボタン(今回の場合は海の選択肢に最初からチェックを付けたい)を付けたいのですが、どういう方法があるのでしょうか? if文を使って <form action="area.php" method="POST"> <?php $file=file("sizen.csv"); for($i=0;$file[$i];$i++){ $data=explode(",",$file[$i]); if($data[0]==umi){ echo"<input type='radio' checked name='sizen' value='".$data[0]."' >"; echo"$data[1]<br>"; }else{ echo"<input type='radio' name='sizen' value='".$data[0]."'>"; echo"$data[1]<br>"; } } ?> <input type="submit" value="次へ"> とすればできるのですが、 sizen.csvファイルの中身をよく変える為、 if($data[0]==umi){・・・・ という風に、$data[0]==umiのように固定はできません。 この方法を使わずに、ラジオボタンのチェックを いつも選択肢の先頭に付けるにはどのような方法があるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • 削除フラグ

    こんにちわ。今まで、同じような質問をしてきたものです。 PHPの掲示板で削除機能を作成しようとしています。 投稿番号や削除キーがあっていれば、削除をするという 削除フラグまではを作成したのですが、実際の削除(論理削除)がうまく行かず、苦悩しております。下のarray_splice()の配列から特定の行を削除・置換する関数を使用し削除をしようとしているのですがこれでは論理削除などはできないでしょうか?関数ではできないのでしょうか?また、if( $temp[5] !=0 )とすることで、物理削除ではなく表示を させないということで、論理削除としようと考えました。 掲載した記述部分は、削除ボタンが押されたら削除処理をする 部分です。また、実際の書き込み部分も記述させていただきます。 <?php $NO = $_POST["NO"]; $hoge = $_POST["hoge"]; $delkey = $_POST["delkey"]; # 削除ボタンが押されたら if($submit =="削除"){ $data = file("data.txt"); foreach( $data as $value){ $temp = explode("\t",$value); if($temp[4] == $NO && $temp[6] ==$delkey ){ //削除フラグを0以外にする処理 if( $temp[5] !=0 ){ array_splice($data, $temp[4], 1); } } } } ?> 書き込み部分は下のようにしています。 $file = fopen("data.txt", "w"); fwrite($file, "$name\t$mail\t$body\t$dt\t$count\t$flag\t$delkey\n".implode("", $data)); fclose($file);

    • ベストアンサー
    • PHP
  • 掲示板ログの削除方法が分かりません

    XAMPP for Windows Version 1.5.4a   PHP: 5.1.6 掲示板に削除ナンバーと削除キーが合えば記事削除したいのですが行き詰ってます、教えてください。 01.phpが本体01.txtが保存ファイル 01.txtへの書き込みは、タブ区切り 8 名前 タイトル コメント 投稿時間 メールアドレス URL 削除キー $ireru=file("01.txt"); if($_POST["write"]){ $nosyori=explode("\t",$ireru[0]); $no=$nosyori[0]+1; ~タグ処理・改行対策・エラーチェック記述~ $data="$no\t$name\t$title\t$comment\t$time\t$mail\t$url\t$sakujyokey\n"; array_unshift($ireru, $data); } //削除処理// ここが問題・・・ //再構築// if($_POST['write'] || $_POST['delete']){ $fp=fopen("01.txt","w"); foreach($ireru as $dasu) fputs($fp,$dasu); fclose($fp);} 番号<input type="text" name="delno">削除キー<input type="password" name="sakujyokey2" value=""> <input type="submit" name="delete" value="記事削除"> ------------------------------------------ 下記を実行すると記事分だけ(9記事あれば削除できませんが9回出る)削除できませんが返ってきます。 if($_POST['delete']){ for($i=0; $i<count($ireru); $i++){ $nosyori=explode("\t",$ireru[$i]); if($nosyori[0] == $_POST['delno'] && $nosyori[7] == $_POST['sakujyokey2']){ array_splice($ireru,$i,1); echo"該当記事を削除しました"; }else{echo"削除できません";} } よろしくお願いします

    • 締切済み
    • PHP
  • 掲示板で確認画面からデータを送るには

    過去に同じような質問もありましたが、いろいろ検索してこちらの過去ログを拝見しても解決できなかったので質問させてください。 掲示板で確認画面から掲示板へ書込みのデータを送りたいのですが、なかなかうまくいきません。 以下が掲示板のソースと確認画面のソースです。 「掲示板のページ」 <?php if ($_POST["write"] == "書込") { $log = $title . "\t" . $namae . "\t" . $body . "\n"; $fp = fopen("../php/test1.txt","a"); fwrite($fp,$log); fclose($fp); } $data = file("../php/test1.txt"); for($i=sizeof($data)-1;$i>=0;$i--){ list($title, $namae, $body) = explode("\t", $data[$i]); print <<<eof タイトル:{$title}<br><br> 名前:{$namae}<br><br> 記事NO.${i}:{$body}<br> <hr> eof; } ?> 「確認のページ」 <form name="form" action="./form.php" method="POST"> <input type="hidden" VALUE="$title,$namae,$body" > <input name="write" type="submit" value="書込"> </form> おわかりの方いましたらご教授お願いします。

    • 締切済み
    • PHP
  • ループ処理について

    テキストファイルにある数字が存在するかしないかの判断をしたいですがうまくいきません、どこが悪いのでしょうか・・・。 <?php $log=file("1.txt"); for($i=1;$i<count($log);$i++){ echo"<a href=1.php?no=$i>$i</a> ";} echo"<BR><BR><BR><BR><BR>"; if ($_GET["no"]) { $no = $_GET["no"]; $log=file("1.txt"); for($i=0;$i<count($log);$i++){ $list=explode("<>",$log[$i]); if($no==$list[1]){echo"$list[0]"."はOk<BR>";} elseif($no!=$list[1]){echo"";} } if($no!=$list[1]){echo"存在しません";} } ?> 1.txtの中身は 7<>7<> 8<>7<> 5<>5<> 6<>5<> 3<>3<> 4<>3<> 1<>1<> 2<>1<> 右の数字(7・5・3・1)が存在確認対象で、 ?no=数字で呼び出し、getでの呼び出し数字が右に存在すれば左の数字を表示します。 存在しなかったら 存在しません という言葉を1回だけ表示します。 no=1とno=2 no=4 no=6だけ上手くいくのですが、他はokと存在しませんが両方混在してしまいます。no=3 5 7も1 2のようにしたいのですが、 どう記述すれば上手い具合にいくでしょうか? よろしくお願い致します。

    • 締切済み
    • PHP

専門家に質問してみよう