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

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

ただいまの
回答率

90.51%

  • PHP

    20395questions

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

PHP 簡易的な掲示板で、テキストファイルの編集について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,143

Nobuyasu

score 4

phpファイルとは別に、テキストファイルを同じディレクトリに作っています。
削除までは問題なく動作しましたが、編集機能(keijiban.txtから投稿番号を、編集番号としてPOSTでそれぞれ取得したものを比較して一致したときargs[2]に編集内容をPOSTしたコメントを上書き、file_put_contentsでテキストファイルに上書き)を作成したのですが、編集ボタンを押すと投稿が1〜3個しか表示されなくなりました。また再読み込みをすると同じ現象が起きます。

どこをどのように書き換えるべきでしょうか。アドバイスをよろしくお願いします。

今度こそソースコードをバッククオートで囲みました。度々申し訳ございません。

<!DOCTYPE html>


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>掲示板</title>
</head>
<body>
<form action=keijiban.php method="post">
  名前:<br />
  <input type="text" name="name" size="30" value="" /><br />
  コメント:<br />
  <textarea name="comment" cols="30" rows="5"></textarea><br />
  <br />
  <input type="submit" value=“投稿” />
  <br />
  <br />
  削除する投稿番号:
  <input type="number" name= "delete" value=""><br />
  編集する投稿番号:
  <input type="number" name= "change" value=""><br />
  編集内容:<br />
  <textarea name="change_comment" cols="30" rows="5"></textarea><br />
  <input type="submit" value=“編集” />
  <br />
  <br />
  <br />
  <br />
</form>

<?php


  function dispKekka($var, $var_kata){
    print('変数に格納されている値は'.$var.'です<br>');
    print('変数の型は'.$var_kata.'です<br><br>');
  }


  function comment_change($change_number,$change_comment){
    $array = file("keijiban.txt");
    for($num = 0; $num < count($array); ++$num){;
      $args = explode("<>",$array[$num]);
      if( "{".$change_number."}" == $args[0]){
        $args[2] = "{".$_POST["change_comment"]."}";
        return $args[2];
      }
    }
}



    $fpr = fopen("keijiban.txt","r");
    for($num = 0;fgets($fpr);$num++);
    $num_ = $num+1;
  fclose($fpr);


    date_default_timezone_set('Japan');






    if($num == 0){
    if(isset($_POST["name"]) and isset($_POST["comment"])){
      if($_POST["name"] != "" and $_POST["comment"]){
            $fpw = fopen("keijiban.txt","w");
            fwrite($fpw,"{1}"."<>{");
            fwrite($fpw,$_POST["name"]."}<>{");
            fwrite($fpw,$_POST["comment"]."}<>{");
            fwrite($fpw,date('Y年m月d日 H時i分s秒')."}\n");
            fclose($fpw);
      }
    }
    }



    else{
    if(isset($_POST["name"]) and isset($_POST["comment"])){
      if($_POST["name"] != "" and $_POST["comment"]){
            $fpa = fopen("keijiban.txt","a");
            fwrite($fpa,"{".$num_."}<>{");
            fwrite($fpa,$_POST["name"]."}<>{");
            fwrite($fpa,$_POST["comment"]."}<>{");
            fwrite($fpa,date('Y年m月d日 H時i分s秒')."}\n");
            fclose($fpa);
      }
    }
    }
  if(isset($_POST["delete"]) and $_POST["delete"] != ""){
    echo("削除する投稿番号が入力されました。".$_POST["delete"]."<br />\n");
    $del = intval($_POST["delete"]) - 1;
    $file = file('keijiban.txt');
    unset($file[$del]);
    file_put_contents('keijiban.txt', $file);
  }





$file = "keijiban.txt";
$array = file($file);
for($num = 0; $num < count($array); ++$num){
  $args = explode("<>",$array[$num]);
  $new_num = $num + 1;
  $array = file($file);
  $args[0] = "{".$new_num."}";

  if($_POST["change"] != ""){
    if("{".$_POST["change"]."}" == $args[0]){
      $args[2] = comment_change($_POST["change"],$_POST["change_comment"]);
      file_put_contents("keijiban.txt",$args);
    }
  }

  echo("投稿番号".$args[0]."<br />\n");
  echo("投稿者".$args[1]."<br />\n");
  echo("コメント".$args[2]."<br />\n");
  echo("投稿日時".$args[3]."<br />\n<br />\n");

}


?>
</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • キャンセル

  • kei344

    2017/02/15 11:53

    '''(カンマ3つ)ではなく ```(バッククオート3つ)です。記入エリアの右部分あたりにリアルタイムに結果が表示されていると思うので、そこを見ながら調整してください。

    キャンセル

  • m6u

    2017/02/15 12:05

    バッククオートは、Shift+@ね。Shift+7じゃないよ。

    キャンセル

回答 1

checkベストアンサー

+3

投稿番号の管理をどう捉えるか、整理したほうがいいかもしれません。

for($num = 0; $num < count($array); ++$num){でループを回す場合、
$numは0から始まり$array-1で終わりますが、
keijiban.txtに記録している投稿番号は削除すると歯抜けになるので、
$new_num = $num + 1;としてあと$args[0] = "{".$new_num."}";としているので、
ファイル上の投稿番号とズレます。

歯抜けさせないために番号を振り直すとすると、
誰かが画面を開きっぱなしにしている最中に他の人が投稿を削除すると、
例えば本来削除したい5番の投稿が実は他人によって既に4番になっていて、
6番がずれて5番になってしまっているのを削除してしまう、
みたいな挙動をします。

ループカウンタの$num由来で投稿番号を作らないようにして、
ファイルに記録してある投稿番号を改ざんしないようにするだけで、
動きそうな気がします。

あと細かいこととして、andとorは&&||の方がいいです。
使い方によっては意図しない挙動を誘発します。
PHP/andと&&など比較演算子の違い - TOBY SOFT wiki
PHPのand,or演算子の使い道を考えてみる | WEB EGG

さらに細かいこととして、
$args = explode("<>",$array[$num]);
list($post_num, $post_user, $post_comment, $post_date) = explode("<>", $array[$num]);
みたいにすると、可読性が高まって混乱を防げます。


ここはこうすると破壊せずに済むかもよ。

  if($_POST["change"] != ""){
    if("{".$_POST["change"]."}" == $args[0]){
      $args[2] = comment_change($_POST["change"],$_POST["change_comment"]);
      $array[$num] = implode("<>", $args);
      file_put_contents("keijiban.txt",implode("", $array));
    }
  }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/15 12:59 編集

    ありがとうございます。
    投稿番号を$numとは関係ないようにしてみると期待している動きをしました。

    ただ編集後に
    ``` file_put_contents("keijiban.txt",$args[2]);```
    この動作を行なっているのですが、```file_put_contents```の書いている場所が悪いのか全てargs[0]の中に投稿番号・名前・コメント・日付が入ってしまいます。

    キャンセル

  • 2017/02/15 13:13 編集

    file_put_contents()でファイルを$args[2]で破壊してますね。
    しかし$arrayだとしても、$arrayの中身を書き換えないと意味がない。
    $arrayの該当箇所を、もう一度編集し直してから、file_put_contents()しなおす。

    投稿を表示する場面でコメント差し替えの動作が混ざっていてそこでファイルに書き出すのは
    流れが良くないので、
    投稿を表示するループの前にコメント差し替えブロックを置いたほうがいい。

    キャンセル

  • 2017/02/15 19:56

    回答ズバリを待っているような気がしたので、一応デバッグしてみました。

    キャンセル

  • 2017/02/15 22:29

    そういうわけではなかったのですが...汗
    ありがとうございます!解決できました。

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    php初心者です。issetの使い方がよくわかりません。

    issetをつかって、名前とコメントを入力したときと、空白のときで、働くプログラムを変更したいのですが、やり方がよくわかりません。 該当のソースコード <form acti

  • 解決済

    PHP:パスワードが一致したときのみ、投稿の削除をする簡易掲示板

    パスワードが一致したときの条件式をプログラムに書いても反応しません。/ファイル消去/ブロックの6行目あたりにあるif文のandの右側の条件式です。この式で使われている$delDat

  • 解決済

    php 掲示板の消去機能

    ```php コード <?php ini_set('display_errors', 1); error_reporting(E_ALL); date_defa

  • 解決済

    php 簡易掲示板の編集

    実現したいこと 簡易掲示板について。 テキストと送信ボタンがある掲示版を扱います。 フォームを送信すると、別に用意したテキストファイルに内容が保存され、そこから読みだされた内

  • 解決済

    php掲示板作成について。

    前提・実現したいこと php7.0.12にて、掲示板作成をしてる 出力先はcsvである。 コメントを未入力の場合のエラー表示が何故か出来ない。コメント入力してもec

  • 解決済

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

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

  • 解決済

    掲示板の削除機能をつけたい

    簡易な掲示板を作成しました。タイトルや名前などをつけて投稿ができるようになっています。このコードを応用してできるだけ簡単に投稿した内容を削除する機能をつけたいです。アイデアが思い浮

  • 受付中

    ボタンをクリックすると図形が1マスズレるような処理

    PHPとHTMLを使用して以下のようなプログラムを制作していますがうまく動きません。 □□□□□■□□□□□□□ の状態から▶のボタンを押すと ↓ □□□□□□■□□□

同じタグがついた質問を見る

  • PHP

    20395questions

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