PHPの中にHTMLを書いてその中にまたPHPを書く方法

## やりたかったこと
- よくある初心者用のサンプルコードを見ながら作っていましたが、**掲示板でマイページ**を作っているサイトは見付からず、**自分が投稿した内容だけを表示するマイページを作りたいな**と思って試行錯誤した内容を纏めたいと思います。


## PHPの掲示板でマイページを作成する
- というかタイトルだけ見ると「は？」ってなるかもしれませんが、私自身が一体どうやったらこの情報を手に入れられるんだと思い、ググっていた文字です…。やりたかったことを文字に表すとこの記事のタイトルのようになります。
- マイページというと自分の登録した内容、例えば「名前」「住所」「メールアドレス」「パスワード」などが表示されるものかもしれませんが、そうではなく、ひとこと掲示板で**自分が投稿した内容だけ**を表示したかったのです。あのアルファベットの某SNSのプロフィールのような感じで。
- もし諸先輩方でこちらの投稿を見て、「もっと綺麗に書けるよ！」という方法がございましたらご教示くださいますと幸いです。

## 動作環境など
- AWS EC2上にLAMP構成としています。
- Linux2
- Apache
- MariaDB（RDS）
- PHP8.1

- 初心者向け（というか自分が初心者）ですが、こちらの記事では細かな部分の説明はしておりませんのでご注意ください。

## DBのテーブル構成
- アプリケーション用のデータベースを作成し、その中に下記2つのテーブルを作成して接続しています。
- 前提として、**会員登録**をしていて、【membersテーブルのid】と【postsテーブルのcreated_by】が合致していればpostsテーブルの**post**（投稿内容）が一覧表示される、というイメージです。
- **members**テーブル
     - id　name　email　password　created　modified
- **posts**テーブル
    - id　post　created_by　created　modified

## マイページ作成
- マイページのイメージはこんな感じです。
    - 自分が投稿した内容だけが表示されること、また自分が投稿したものだけなので、編集や削除が行えるボタンも表示されます。

![mypage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676304/e6a1d713-edc7-cd3a-cc81-144bb82344ef.png)


- ヘッダー部分のPHP

```
<?php
session_start();
require('dbconnect.php');

if (isset($_SESSION['id']) && $_SESSION['time'] + 3600 > time()) {
    $_SESSION['time'] = time();

    $members=$db->prepare('SELECT * FROM members WHERE id=?');
    $members->execute(array($_SESSION['id']));
    $member=$members->fetch();
} else {
//ログインしていない場合はトップページへ帰す
    header('Location: index.php');
    exit();
  }

//投稿を記録する
if (!empty($_POST)) {
     if ($_POST['post'] !=''){
           $post = $db -> prepare('INSERT INTO posts SET created_by=?, post=?, created=NOW()');
           $post ->execute (array(
            $member['id'],
            $_POST['post']
           ));
         //重複投稿を防ぐ
          header('Location:post.php');
          exit();
    }
}

//membersテーブルとpostテーブルから情報を取得して$posts変数に代入する
//ORDERBYで並べ換えて、DESCで降順に並べる
$posts = $db->query('SELECT m.name, p.* FROM members m, posts p WHERE m.id=p.created_by ORDER BY p.created DESC');
?>
```


- 実際は上記と続けてそのまま下記HTML部分も繋がってますが、見やすさのために
一部省略してます。

```
<section class="toukou1">
    <form action="" method="post">
    <input type="hidden" name="token" value="<?=$token?>">
        <div class="edit">
        <p class="myname">
          <?php echo htmlspecialchars($member['name'], ENT_QUOTES); ?>さんのマイページです。
	</p>

         <p><a href="post.php">投稿画面へ戻る</a></p>

          <span class="logout"><a href="logout.php">ログアウト</a></span>
        </div>
</form>
</section>
<br>

<section class="toukou2">
     <h2>マイ投稿一覧</h2>

          <?php 
            foreach($posts as $post){
               if ($_SESSION['id'] !== $post['created_by']){
		       continue; 
                  }
                 echo htmlspecialchars($post['post'], ENT_QUOTES);
                 echo "<br>";
                 
		 echo "【";
		 echo htmlspecialchars($member['name'], ENT_QUOTES);
		 echo "】";
		 echo htmlspecialchars($post['created'], ENT_QUOTES);
	       

		 echo "【";
		 echo " <a href="."update_my.php?id=";
		 echo htmlspecialchars($post['id'], ENT_QUOTES);
		 echo ">編集</a> ";
         echo "】";


		 echo "【";
		 echo "<a href="."delete_my.php?id=";
		 echo htmlspecialchars($post['id'], ENT_QUOTES);
		 echo ">削除</a>";
		 echo "】";

         echo "<br>";
         echo "<hr>";
}

?>


</section>
```

- はい、ただただ見づらいです(;^ω^)
- echoの乱用部分を解除し、そのまま書くと下記のような感じです。PHPの中にHTMLを書いてその中にまたPHPを書くという、何がしたかったのか？が分かるかと思います。（さらに見づらいかもですが…）

```
  <?php 
      foreach($posts as $post){
      if ($_SESSION['id'] !== $post['created_by']){
	  continue; 
      }
    htmlspecialchars($post['post'], ENT_QUOTES);
    <br>
  【 htmlspecialchars($member['name'], ENT_QUOTES); 】
     htmlspecialchars($post['created'], ENT_QUOTES);
  【 <a href=update_my.php?id=htmlspecialchars($post['id'], ENT_QUOTES);>編集</a> 】
  【 <a href=delete_my.php?id=htmlspecialchars($post['id'], ENT_QUOTES);> 削除 </a> 】
  <br>
  <hr>
  }
  ?>

```

- ですが初心者が様々な参考と出来そうな記事を見ては色々試してエラーになり、最終的に辿り着いたのが上記のecho乱用の記述方法です(;^ω^)
    - 一応ポイントとしては【continue】で、自分が投稿した内容以外のものはスキップするよ、という指定です。
    - これを入れないと、他のユーザーが投稿した内容が「表示はされないけど取得はしている」といった感じになってしまい、コード下部の【hr】の影響で、見えない投稿分の線が何重にも表示されるという事態になってしまいます。


- 本来ならこのような書き方ではなく、きっともっと綺麗に記述することが出来るんだろうなぁと思いますが、無理やりでも「書けた」「出来た」ので現時点ではこれでOKと思っています。
- なので諸先輩方、もっと綺麗に書ける方法があるよ、などありましたら教えてくださいますと喜びます。
- 同じく初心者の方で同じようなことで困っている方、echo乱用したこんな書き方もアリなのかな…くらいの気持ちで参考にしてくだされば嬉しいです。
- 引き続き、学習を頑張っていきたいと思います。