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

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

ただいまの
回答率

90.33%

PHPで簡易掲示板を作っています。削除フォーム内のexplodeの中に何の変数を入れていいかわかりません。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 80

KZKKZ_ZKY

score 1

前提・実現したいこと

PHPで簡易掲示板を作成しています。
削除フォームで受け取った数値と、配列の[0]が同じ時にその行を削除(その行だけ隠す)ようにしたいです。

発生している問題・エラーメッセージ

Warning: fwrite(): supplied resource is not a valid stream resource in /public_html/mission_3-3.php on line 49

Warning: fclose(): supplied resource is not a valid stream resource in /public_html/mission_3-3.php on line 50
mission_3-1.txt 

該当のソースコード

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>簡易掲示板</title>
  </head>
  <body>

    <form action="mission_3-3.php" method="post">
      <input type="text" name="name">
      <textarea name="comment" rows="8" cols="80"></textarea>
      <button type = "submit">送信</button>
    </form>
    <br>
    <form action="mission_3-3.php" method="post">
      <input type="text" name="delete">
      <button type = "submit">削除</button>
    </form>

    <?php

    $date = date("Y/m/d H:i:s");
    $filename = "mission_3-1.txt";
    $count = count( file($filename) );
    $fp = fopen($filename, "a" );

    if(!empty($_POST["name"])&&!empty($_POST["comment"])){

      $namae = $_POST["name"];
      $message = $_POST["comment"];

      $toukou = $count."<>".$namae."<>".$message."<>".$date;

      $keijiban = explode("<>",$toukou);
      $string = implode(" ",$keijiban);

      fwrite( $fp , "$string\r\n" );
      fclose( $fp );

    }elseif(!empty($_POST["delete"])){

      $delete = $_POST["delete"];
      $fp2 = fopen($filename,'w');

     ** for($i = 0; $i <= $count; $i++){
        $data2 = explode("<>",$filename);

        if($data2[0] != $delete){
          fwrite( $fp2 , "$filename\r\n" );
          fclose( $fp2 );
        }
      }**
    }
    $ret_array = file($filename); 
    foreach($ret_array as $aaa){
          echo $aaa;
          echo "<br>";     
        }

    ?>

  </body>

</html>
ボールドテキスト

試したこと

過去の質問は大体読み漁ったはずですが解決できませんでした。
配列を入れるとエラーが出てしまうことはわかったのですが、
を受け取るif文の変数を使うことができないので困りました。(グローバル変数というのも使ってみましたあうまくいきませんでした。)

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • KZKKZ_ZKY

    2019/08/14 15:01

    かなりの質問を読み漁っても解決できなかったため質問させていただきました。
    タイトルの変更に対する助言ありがとうございます。

    キャンセル

  • m.ts10806

    2019/08/14 15:02

    質問は編集できますので適宜調整いただければと。
    「質問を読み漁った」ことがわかるように、確認した質問のURL等も追記しておいていただければと思います(代表的なもので結構です)

    キャンセル

  • KZKKZ_ZKY

    2019/08/14 16:30

    編集フォームを探すのに時間がかかってしまいましたが、変更できました。
    質問自体初めてで不慣れで申し訳ないです。

    キャンセル

回答 1

checkベストアンサー

+4

とりあえず、ソースを見る限り色々問題を含んでいますが、勉強中ということなので、とりあえずエラーと質問のexplodeへの値のセットについて書きますね。

1.エラーについて
エラー内容からすると、fwrite、fcloseを行う際に使用している$fpに何も入っていない、つまり43行目にあるfopenで失敗しているようです。

「w」オプションでfopenをする場合、失敗する理由は該当ファイルの作成権限またはアクセス権限が無い場合が多いかと思いますので、まずはphpファイルがあるディレクトリのパーミッションを見て、phpでのファイル作成権限があるかどうかを確認してみてください。

また、プログラムを書く際に、何らかのメソッドを使用して値を取得した場合、成功しているか同化のチェックを行うようにした方が良いです。fopenの場合は$fpに失敗した際の値(false)が入っていないかどうかのチェックですね。

if($fp !== false){
--成功時の実行内容
}

また、このプログラムだと、25行目と43行目で同じファイルを別々のモードで開いているので余分なリソースが発生しています。
表示(読み込み)、書き込み、削除で別々のモードで開く必要があるのであればif等で分岐した中に記述した方が良いかと思います。

2.削除処理内の変数について

多分やりたいことは、指定された番号(deleteにセットされていると想定)と一致する行のデータを見つけて消す…という事だと思いますので、

$hoge = file($filename);


と書くことで、現在保存されているデータが格納された変数$hoge(名前は適当に変えてください)を作成します。

この変数をforやforeachでループ処理させることで処理を行ってみてください。

for($i = 0; $i < $count; $++){
    $data2 = explode("<>", $hoge[$i]);

    // 具体的な処理
}

または

foreach($hoge as $fuga){
    $data2 = explode("<>", $fuga);

    // 具体的な処理
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/08/15 00:25

    的確な回答ありがとうございます。
    Notice: Array to string conversion in /public_html/mission_3-3.php on line 51
    Warning: fwrite(): supplied resource is not a valid stream resource in /public_html/mission_3-3.php on line 51
    Warning: fclose(): supplied resource is not a valid stream resource in /public_html/mission_3-3.php on line 52

    変更したのですが、またもやこのようなエラーが出てしまいました。
    explodeしても配列というあつかいになってしまうのですね。
    そこを解決できるように頑張ろうと思います。

    質問に答えていただきありがとうございました!

    キャンセル

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

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

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

  • トップ
  • PHPに関する質問
  • PHPで簡易掲示板を作っています。削除フォーム内のexplodeの中に何の変数を入れていいかわかりません。