【PHP】投稿種類別で投稿を出力してくれる機能

PHPについて学習内容を備忘録としてまとめます。
投稿種類別で投稿を出力してくれる機能を実装しましたので記載します。

![アニメーション.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/b2388bc0-baf9-588e-cf69-d32b5b3d6c2a.gif)

##投稿を種類別で表示
まずは表示したいページに下記コードを書きます。

```php

<?php
$page_type = $_GET['type'];
//$_SESSION['staff_code']は現在ログインしているユーザーのIDを取得しています
print'<a href="staff_top.php?staff_code='.$_SESSION['staff_code'].'&type=main">自分の投稿</a>';
print'<a href="staff_top.php?staff_code='.$_SESSION['staff_code'].'&type=favorites">いいねした投稿</a>';

$current_user=get_user($_SESSION['staff_code']);

switch ($page_type) {
  case 'main':
    $posts = get_posts($current_user['code'],'my_post',0);
  break;

  case 'favorites':
    $posts = get_posts($current_user['code'],'favorite',0);
  break;
}

<?php foreach($posts as $post): ?>

    <?php print'<br />'; ?>
    <?php print ''.$post['name'].''; ?>

<?php endforeach ?>
```
`自分の投稿`と`いいねした投稿`をリンク表示させて現在のパスを指定します。
そして&以降に`type`を指定し投稿別で種類を分けています。
パスの中の`type`の値は`$page_type`に渡しています。

パス中の?や&については、[【PHP】リンクの?と&](https://qiita.com/ryouya3948/items/ecd29e5447dc5de0ddee)　を参照ください。

```php

<?php
$page_type = $_GET['type'];
//$_SESSION['staff_code']は現在ログインしているユーザーのIDを取得しています
print'<a href="staff_top.php?staff_code='.$_SESSION['staff_code'].'&type=main">自分の投稿</a>';
print'<a href="staff_top.php?staff_code='.$_SESSION['staff_code'].'&type=favorites">いいねした投稿</a>';
```
`type`の値は`$page_type`に渡されているので、この値ごとに`$posts`に渡す値を分けています。
`get_posts`関数についてはまた別の処理なので説明していきます。

##get_posts関数
少し長い関数にはなっていますがやっていることとしては、
受け取った`$page_type`によってspl文を変更し取得する投稿種類を判別する関数です。

```php

function get_posts($page_id,$type){
  try {
    $dsn='mysql:dbname=shop;host=localhost;charset=utf8';
    $user='root';
    $password='';
    $dbh=new PDO($dsn,$user,$password);
    switch ($type) {
      case 'my_post':
      $sql = "SELECT mst_staff.code,mst_staff.name,mst_staff.password,mst_staff.delete_flg,mst_product.code,mst_product.name,mst_product.address,mst_product.time_start,mst_product.time_end,mst_product.gazou,mst_product.user_id
              FROM mst_staff INNER JOIN mst_product ON mst_staff.code = mst_product.user_id
              WHERE user_id = :id AND delete_flg = 0";
      break;

      case 'favorite':
      $sql = "SELECT mst_staff.code,mst_staff.name,mst_staff.password,mst_staff.delete_flg,mst_product.code,mst_product.name,mst_product.address,mst_product.time_start,mst_product.time_end,mst_product.gazou,mst_product.user_id
              FROM mst_product INNER JOIN favorite ON mst_product.code = favorite.post_id
              INNER JOIN mst_staff ON mst_staff.code = mst_product.user_id
              WHERE favorite.user_id = :id";
      break;

    }
    $stmt = $dbh->prepare($sql);
    $stmt->bindValue(':id', $page_id);
    $stmt->execute();
    return $stmt->fetchAll();
  } catch (\Exception $e) {
    error_log('エラー発生:' . $e->getMessage());
    set_flash('error',ERR_MSG1);
  }
}
```
`get_posts関数`の引数である`$page_id`が現在のユーザーID、`$type`が`$page_type`の値になります。
`$page_type`の値よりSQL文を判別して該当の投稿を出力しています。

`favorite`テーブルは投稿をいいねした際に`いいねした人`と`いいねした投稿`を紐づけてくれるテーブルです。
詳しくはこちらで説明していますのでご参考ください。
⇒[【PHP】いいね機能実装](https://qiita.com/ryouya3948/items/7b3899e8d2cc8c80dcc6)

##投稿種類別に投稿表示
投稿種類別に投稿を出力できるようになったので、実際に表示させます。
一番初めに記載したコードの中にあった下記の記述により投稿を表示させることができます。

```php

<?php foreach($posts as $post): ?>

    <?php print'<br />'; ?>
    <?php print ''.$post['name'].''; ?>

<?php endforeach ?>
```
上記の処理は`$posts`の配列の中にある分だけ値を取り出します。
これで表示させるところまでできました。

##参考URL
https://qiita.com/nyann123/items/7320d98d17768986add0