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

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

ただいまの
回答率

89.13%

簡要掲示板の編集機能

解決済

回答 3

投稿

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

massuuuu

score 41

簡要掲示板を作るという自分への課題をしております。
HMTLフォームから名前、コメントを入力しテキストファイルに
番号<>名前<>コメント<>日時を保存し、HTMLフォームの下に表示するというものを
作っております。

やりたい事
指定された投稿番号のものだけ編集できるようにする。
自分なりに調べながらコードを書いてみたのですが、editを押すと、フォームの下に表示されていた
投稿が消えるだけです。
テキストファイルにはなんの影響もありません。

あと、編集かどうかわかるように<input type="hidden">タグを用いて、編集モードかどうかを判別する
この意味がよく分かりません。

未熟者ですが、よろしくお願いします。
一応入力フォームの写真を貼っておきます
以下コード

<?php
header('Content-Type: text/html; charset=UTF-8');

require_once('Kadai2_15.php');
?>
<html>
  <head>
    <meta charset="utf-8"/>
    <title>sample</title>
  </head>
  <body>
    <form method="post" action="<?php echo($_SERVER['PHP_SELF']) ?>">
      <p>名前:</p>
      <input type="text" name="name" placeholder="山田太郎" required="required" value="<?php echo $simEdit[1]; ?>">
      <p>コメント:</p>
      <textarea type="text" name="com" maxlength="20" required><?php echo $simEdit[2]; ?></textarea>
      <!-- <input type="hidden" name="token" value="<?=h(sha1(session_id()))  ?>"> -->
      <input type="submit" name="mode" value="add">
    </form>
    <form action="<?php echo($_SERVER['PHP_SELF']) ?>" method="POST">
      <p>削除対象番号:</p><!-- 削除対象番号 -->
      <input type="text" name="deleteNo">
      <input type="submit" name="delete" value="削除">
      <input type="hidden" name="mode" value="delete">
    </form>
    <form method="POST" action="<?php echo($_SERVER['PHP_SELF']) ?>">
      <p>編集対象番号:</p><!-- 編集対象番号 -->
      <input type="text" name="edit"><br>
      <input type="submit" name="mode" value="edit">
    </form>
    <p>
      <p>
        掲示板:
      </p>
      <?php

        foreach ((array)$text_rows as $text_row) {//配列でcount<>name<>comment<>data表示
          if($text_row === ""){
            continue;
          }
          $ret = explode("<>", $text_row);
          echo h($ret[0])."番  ";
          echo h($ret[1])." さん  ";
          echo h($ret[2])."  ";
          echo h($ret[3]);
          echo "<br>";

        }
      ?>

    </p>
  </body>
</html>
<?php
header('Content-Type: text/html; charset=UTF-8');
?>
<html>
  <head>
    <meta charset="utf-8"/>
    <title>sample</title>
  </head>
  <body>

    <?php

      function h($str) {
        return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
      }

      //session_start(); // 1

      $name = (string)filter_input(INPUT_POST, 'name'); //名前フォーム値 文字列にキャスト
      $comment = (string)filter_input(INPUT_POST, 'com');//コメントフォーム値 フィルタリングする
      //$token = (string)filter_input(INPUT_POST, 'token'); // トークンセッション
      $fileName = 'Kadai2_15.txt';

      switch($_POST["mode"]){
        case "add"://投稿追加処理
          $fp = fopen($fileName, 'a+');
          if ($_SERVER['REQUEST_METHOD'] === 'POST'/* && sha1(session_id()) === $token */) { // postが送られて来てるか?CSRF対策
            flock($fp, LOCK_SH);
            $text_rows = file($fileName);
            $lastline = explode("<>", $text_rows[count($text_rows)-1]);//行数をカウント
            $num = $lastline[0];
            $add_text = ($num + 1)."<>".$name."<>".trim($comment)."<>".date('H時i分');//追加したい文章
            array_unshift($text_rows, $add_text);
            flock($fp, LOCK_EX);
            fwrite($fp, $add_text."\n");
            flock($fp, LOCK_UN);
            fclose($fp);
          }
          break;
        case "delete"://投稿削除処理
          if (isset($_POST["delete"])) {

            $fp = fopen($fileName, 'a+');
            $delete = $_POST["deleteNo"];
            flock($fp, LOCK_SH);
            $delarray = file($fileName);
            //var_dump($delarray);
            for ($j = 0; $j < count($delarray) ; $j++){
              $delData = explode("<>", $delarray[$j]);
              if ($delData[0] == $delete) {
                  array_splice($delarray, $j, 1);
                  file_put_contents($fileName, implode($delarray));
                  flock($fp, LOCK_UN);
                  fclose($fp);
                  break;
                }

          }

          break;
          }
        case "edit"://投稿編集処理
          if (isset($_POST["edit"])) {

            $fp = fopen($fileName, 'a+');
            $edit = $_POST["edit"];
            flock($fp, LOCK_SH);
            $editarray = file($fileName);
            //var_dump($delarray);
            for ($j = 0; $j < count($editarray) ; $j++) {
              $ediData = explode("<>", $editarray[$j]);
              if ($ediData[0] == $edit) {
                //$simEdit = explode("}<>{", $ediCon[$k]);
                for($h = 0; $h < count($editarray); $h++){
                $simEdit[$h] = mb_substr(trim($editarray[$h]), 1, -1);
                flock($fp, LOCK_UN);
                fclose($fp);
                break;
              }
            }
          }
        }

      }



    ?>
  </body>

</html>

イメージ説明

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+5

簡「易」掲示板ですかね?
自分への課題であれば、もう少しちゃんと勉強した方がいいですよ。
スクリプトがネットの情報のただのツギハギになっています。

学習するのであればデバッグ環境を整えて、変数の変化を確認してください。
意図していない変数の箇所を洗い出す時間が格段に早くなります。

今回のケースだと、POST をちゃんと見てみると良いです。
意図した方法になっていないはずなので、投稿方法を検討する必要があります。

完全に余談になりますが、セキュリティを意識したスクリプトにするなら
<?php echo($_SERVER['PHP_SELF']) ?>
はもう少し丁寧に扱ってください。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/03/03 08:47

    (*´艸`)。o○(物理削除ができてるのに変更できないとかおかしなひとですよね)

    キャンセル

checkベストアンサー

+3

前はあえて確認しませんでしたが、
自身が書いたプログラムのコードをどのコードが
どのような意図や意味があり、どのような効果があるか、機能があるか
説明できますか?

作ることだけを先行して理解を疎かにしては既に指摘されている通りツギハギなコードとなり、
いつまでたっても完成しません。

1つ1つの機能を着実に理解し、細分化して学んでいく必要があります。
掲示板というのはCRUD(そのまま検索すれば出てくるので調べてください)が全て詰まっているもので
学ぶには良いですが、そもそもコードを書くというところで、ただ何の意識も意思もないまま書いても
おそらく思ったものは出来上がらないでしょう。

質問に上がっている内容を解決するだけなら簡単です。
ただ、それでは質問者さんのためになりません。
このteratail内には同様に、理解が届かないままやっていていつまでも同じ個所を質問していて
完成していない質問者が散見されます。
同じ道を辿らないためには基礎の理解が不可欠です。
つまり、自身が書いたコードをきちんと理論的に説明できるようになること、です。
がんばってください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/03/04 23:41

    ありがとうございます。
    一から確認してみようと思います!

    キャンセル

+1

別の方もかかれていますが、まずはデバッグ(泥臭いですが、色々なところにprintやvar_dumpを仕込んでみたり)して、変数にちゃんと意図した値が入っているかチェックだと思います。

またプログラムを自分の頭の中で一ステップずつ追ってみることも意外と有効だったりします。何か異変に気づくかもしれません。

余談ですが、掲載されたプログラムが質問者さん作成のものであれば、もう少しプログラムの読みやすさを意識されたほうがよいかと思います。
最低限、インデントをスペース4文字ないしはタブで統一することで読みやすくなります。

インデント見直し前

    for ($j = 0; $j < count($delarray) ; $j++){
      $delData = explode("<>", $delarray[$j]);
      if ($delData[0] == $delete) {
          array_splice($delarray, $j, 1);
          file_put_contents($fileName, implode($delarray));
          flock($fp, LOCK_UN);
          fclose($fp);
          break;
        }

  }

インデント見直し後+α

    for ($j = 0; $j < count($delarray); $j++)
    {
        $delData = explode("<>", $delarray[$j]);
        if ($delData[0] == $delete)
        {
            array_splice($delarray, $j, 1);
            file_put_contents($fileName, implode($delarray));
            flock($fp, LOCK_UN);
            fclose($fp);
            break;
        }
    }

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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