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

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

ただいまの
回答率

88.92%

php簡易掲示板に指定された番号だけを削除する削除機能をつけたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,209
退会済みユーザー

退会済みユーザー

前提・実現したいこと

phpで簡易掲示板に指定された番号の投稿だけ削除できるようにする削除機能たいです。
ただ自分が初心者な事もあり、どこに何をつければいいのかが分かりません。
ここでも同じような質問がたくさんあったのでほぼすべて見てみましたが、自分とはコードの書き方が違っていて理解することが出来ませんでした。

if文で投稿フォームからの投稿か削除フォームからなのか条件分岐させて、foreachを使って1文ずつチェックし指定番号と投稿番号が一致していないときに書き込むことが最初のステップということまでは理解しましたが、それは今書き終えているコードの続きに書くのでしょうか?それともどこかに組み込むのでしょうか?
また、「1文ずつチェックをする」には何をすればいいのかが分かりません。
初歩的な質問ではあると思いますがご教授お願いします・・・!

コードはここまで書きました。

該当のソースコード

<!DOCTYPE html>
<html lang="ja">
<html>
    <head>
        <meta charset="utf-8">
        <title>mission3-3_new</title>
    </head>
    <body>
        <form action="mission_3-3_new.php" method="post">
            【 投稿フォーム 】<br>
            名  前:
            <input type="text" name="user" value=""><br>
            コメント:
            <input type="text" name="comment" value=""><br>
            <input type="submit"><br><br>
            【 削除フォーム 】<br>
            投稿番号:
            <input type="text" name="deletenumber" value=""><br>
            <input type="submit" value="削除"><br><br>

        </form>

<?php
if(!empty($_POST["user"]) || !empty($_POST["comment"])){

    $date = date("y/m/d H:i");

    //カウント用ファイルを開く
    $fp2 = fopen("count.txt","r");
    $num_text = fgets($fp2);//1行目を文字列として読み込む
    fclose($fp2);//ファイルを閉じる

    $num_text +=1;//カウントを1増やす

    $fp2 = fopen("count.txt","w");
    fwrite($fp2,$num_text);//新しい数値を書き込む
    fclose($fp2);

    //投稿内容用ファイルを開く
    $fp = fopen("mission_3-3_new.txt", "a");
    $info = $num_text."<>".$_POST["user"]."<>".$_POST["comment"]."<>".$date;
    fwrite($fp, $info."\r\n");
    fclose($fp);
?>

        【 投稿一覧 】<br>

<?php
    $hairetsu = file("mission_3-3_new.txt");
    foreach($hairetsu as $hensuu){
        $splits = explode("<>",$hensuu);

        //投稿番号、氏名、コメント、日時を表示して改行する
        echo $splits[0].".".$splits[1].".".$splits[2].".".$splits[3]."<br>";

    //繰り返し処理はここまで
    }

}
?>




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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • 退会済みユーザー

    退会済みユーザー

    2019/08/16 16:12

    すみません、初心者マークに気づかなかったので初心者と入れてしましましたが修正しました!
    何度か先生とやり取りはしていたんですが、昨日から出張でしばらく連絡が取りづらいといわれてしまい困って投稿してしまいました…!
    また、似たような質問はほぼすべて目を通したのですが、自分とphp部分のコードがだいぶ違くてどう参考にしていけば分からず質問しました…

    キャンセル

  • m.ts10806

    2019/08/16 16:18

    ヒント回答のみですが、作成中です。
    少々お待ちください。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2019/08/16 16:20

    m.ts10806さん
    ありがとうございます…!

    キャンセル

回答 1

checkベストアンサー

+3

どこに入れればいいのか

削除後にまたリストを読み込んで最新の状態で出力することを加味すると、
「データの読み込み処理より前」であればどこでも良いということになります。

ただ、
「画面出力」を伴わない処理は別にHTMLのドキュメント内に埋め込む必要はないと思います。
あくまで「処理を行うだけ」なので、投稿・編集・削除などの処理はまとめて<!DOCTYPE html>より上に移動しましょう。
そうすると見やすくなります。
(欲を言えば別ファイルにしてincludeしてもらいたい)

foreachを使って1文ずつチェックし指定番号と投稿番号が一致していないときに書き込む

表現と考え方の問題ですが「指定番号と投稿番号が一致していれば飛ばす。そうでなければ書き込む。」としたほうが良いです。

おそらくプログラム的には下記のようになるはずなので。

if($delete_number == $row_number){
  continue;
}
//書き込み

設計的な観点からすると「プログラムを書く時のような表現にする」ほうが良いですね。

※下記のようにするなら「違うとき書き込む」でも良いですけど個人的には「一致した情報を削除する」のが分かるような記述にしたいので。

if($delete_number != $row_number){
  //書き込み
}

他気になる点。
何度も出てくる定型的な文言は定数を使ったほうが良いかなと。

define("COMMENT_LIST_FILE","mission_3-3_new.txt");

//中略

$hairetsu = file(COMMENT_LIST_FILE);

あと変数も意味がある名前をつけたほうが後から見返したときに見通しが良いです。

    $hairetsu = file("mission_3-3_new.txt");
    foreach($hairetsu as $hensuu){


    $comment_list = file("mission_3-3_new.txt");
    foreach($comment_list as $comment_data){

下記のような記事も参考にしましょう。

個人的には、
テキストファイルのデータベースを初心者の段階から学んでも使い道はほぼありません。
確かにファイルの扱いと文字列の扱いは覚えられるかもしれませんが、これをメインで進めていってもあまり利点は大きくないと思います。
学校でやっているなら仕方ない部分はありますが、なるべくデータベースの学習を個人的にでも勧めるようにしてください。

※最も大事なのは「PHPマニュアルを活用できることになること」「エラーメッセージをしっかり読むこと」「デバッグを覚えること」 です。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/08/16 16:53

    凄く勉強になります…!
    投稿・編集・削除はhtmlフォームの後じゃないといけないと思ってたのでこのあと変えたいと思います!
    continueも自分で調べていた時には見なかったのですが、スキップすることが出来るんですね!調べ方が悪いみたいで反省しています…
    プログラムを書く時のような表現や、変数の付け方などはこれから上達できれば…と思います!
    記事や重要な点など何から何までありがとうございます!!教えて頂いたことを考えながら作業してみます!

    キャンセル

  • 2019/08/16 17:29

    >投稿・編集・削除はhtmlフォームの後じゃないといけないと思ってたのでこのあと変えたいと思います!

    PHPプログラムが実行される絶対条件は
    <?php ?> に囲われた中にコードを書くこと です。
    https://www.php.net/manual/ja/language.basic-syntax.phptags.php
    ※ただしファイル最後の?>は省略可能で、省略することが推奨されている

    PHPにとってHTMLは単なる出力文字列の集合体に過ぎません。
    ブラウザから実行することで「HTMLだ」と解釈して表示してくれているだけです。
    最初は下記のようなことをやったかと思います。
    <?php
    echo "Hello World";

    HTMLに関する記述は一切ありませんよね?
    あくまで出力文字列の集合体であるので、HTMLを出力するのでなければ書く必要は一切ありません。

    それにPHPは「サーバーサイドの言語」なので、HTMLとはそもそも実行される段階が違います。
    ※長くなるので下記回答参照されたし
    https://teratail.com/questions/149920#reply-225651

    > continueも自分で調べていた時には見なかったのですが、スキップすることが出来るんですね!調べ方が悪いみたいで反省しています…

    業務ではよく使われるのですが(代替手段は少なくないけど)、あまり諸学者向けの書籍にはないんですかね。これを機会に覚えておきましょう。

    >プログラムを書く時のような表現や、変数の付け方などはこれから上達できれば…と思います!

    これって結構大事です。特に変数名(あと関数名やクラス名)
    あくまで「命名」にあたるものなので、PHPからすれば「文字列の集合体」でしかないのですが、
    やはり「意味が分かる名前をつける」というのは大事なことです。
    望ましいのは「他人が(またはのちの自分が)読み返してもその名前を読んだだけでどういう役割をしているか分かる」ことです。
    ここを今のうちに意識しておくと同時期に学習を始めた人との「差」が出ます。
    「可読性」「メンテナンス性」はコードを書いていくうえでは非常に大事な要素です。

    提示した記事に格言がありますね。
    「コード三日会わざれば刮目して見よ」
    記事ではコメントにフォーカスして書いてありますが、コード全体にも言えると思います。
    「あれ?この変数何のデータ持ってたっけ?」とならないような命名を心がけましょう。

    キャンセル

  • 2019/08/17 07:32

    なぜその作業が必要なのか?というところまで教えていただきありがとうございます!すごくわかりやすく勉強になります…!!

    キャンセル

  • 2019/08/17 13:16

    m.ts10806さん
    ベストアンサー押してなかったようですみません…!ブラウザ上では削除できるところまで行くことが出来ました!

    キャンセル

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

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

関連した質問

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