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

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

ただいまの
回答率

90.11%

簡要掲示板の消去機能

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 573

massuuuu

score 39

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

できないこと
消去機能を追加しようとしているのですが、うまくいきません。
このソースを実行すると下記のようにエラーがでて、調べると文字列ではなく配列が入力されている
とかでファイルに書き込むことができません。
{Warning: file_put_contents() expects parameter 1 to be string, resource given in /home/co-981.99sv-coco.com/public_html/Kadai2/Kadai2_15.php on line 50}

//htmlファイル
<?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">
      <p>コメント:</p>
      <textarea type="text" name="com" maxlength="20" required></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>
    <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

<?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'); // トークンセッション


      switch($_POST["mode"]){
        case "add"://投稿追加処理
          $fp = fopen('Kadai2_15.txt', 'a+');
          if ($_SERVER['REQUEST_METHOD'] === 'POST'/* && sha1(session_id()) === $token */) { // postが送られて来てるか?CSRF対策
            flock($fp, LOCK_SH);
            $text_rows = file("Kadai2_15.txt");
            $count = count($text_rows);//行数をカウント
            $add_text = ($count + 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('Kadai2_15.txt', 'a+');
            $delete = $_POST["deleteNo"];
            flock($fp, LOCK_SH);
            $delarray = file("Kadai2_15.txt");
            for ($j = 0; $j < count($delarray) ; $j++){
              $delData = explode("<>", $delarray[$j]);
              if ($delData[0] == $delete) {
                  array_splice($delarray, $j, 1);
                  flock($fp, LOCK_EX);
                  file_put_contents($fp, implode("\n", $delarray));//問題の箇所
                  break;

                }
          }

          break;
          }
        }



    ?>
  </body>

</html>

まだまだ未熟者で汚いソースと思いますが、よろしくお願いします。

var_dump($delarray)の出力結果 ↓

array(4) { [0]=> string(54) "1<>アンパンマン<>アンパンラブ<>15時46分 " [1]=> string(54) "2<>ジャムおじさん<>ジャムラブ<>15時47分 " [2]=> string(54) "3<>バタコさん<>バター塗りたい<>15時47分 " [3]=> string(45) "4<>チーズ<>キャンキャン<>15時47分 " } 

↓入力結果
イメージ説明

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • m.ts10806

    2018/03/02 15:42

    delete時にfile()関数で情報を取得していますが、$delarrayをvar_dump()にかけると何が出力されますか?結果を質問本文に追記してください。

    キャンセル

  • massuuuu

    2018/03/02 15:46

    回答ありがとうございます!承知致しました!!

    キャンセル

回答 2

checkベストアンサー

+1

PHP: file_put_contents - Manual
第一引数はファイル名を指定するものなので、
このソースで言う$fpを与えてはエラーになります。
与えるべきは'Kadai2_15.txt'になりますが、
ソースの中でなんどもあちこちに'Kadai2_15.txt'が出現するので、
データファイル名のユーザー定義定数として
define("DATA_FILE", 'Kadai2_15.txt');
などとした方がよろしいかと。

もう一つ、case "delete":の下りで、
fopen()しているのにfclose()していないので、
忘れずにやってから、file_put_contents()してください。
ファイルをオープンしたまま同じファイルを上書きすることなんてできませんから。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/03/03 02:23

    先程もありがとうございました😭
    4つの投稿があったとして、
    2を消去したら投稿番号が 1 3 4 となったのですが、消去機能はこれでできているでしょうか?
    2を消去したら投稿番号が 1 2 3 とならなければいけませんか??

    キャンセル

  • 2018/03/05 10:02

    仕様次第です。
    投稿番号がリセットされることなく継続的に維持される番号なのだとしたら、
    削除された番号は欠番になるのが自然な動作です。
    2を消したのに2が残っているのは不自然ですしわかりにくくなります。

    キャンセル

+1

file_put_contents()

第1引数は文字列(指定するのはファイル名のパスの文字列)です。
(WarningメッセージをGoogle翻訳にかけてみてください)

fopen()の返却値は「リソース」であって「文字列」ではありません。

書き込んだ情報を保管しているファイル名を第1引数に入れると良いです。

あと、Kadai2_15.txtというのが同じコードの中に何度も出てきます。
そういうときこそ冒頭など共通で参照できる箇所に変数を定義しておき、
変数をそれぞれの箇所にあてると間違いが減りますよ。

$fileName = 'Kadai2_15.txt';

~~~

$fp = fopen($fileName, 'a+');

~~~~

$text_rows = file($fileName);

~~~

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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