初心者が月10万稼ぐ為の記録9　ブログの投稿フォームを作成

#ブログ投稿フォームを作成

###①form.htmlとblog.phpの２つのファイルを作成

**form.htm**を👇のようにする。

```html
<body>
  <h2>Blogフォーム</h2>
  <form action="blog.php" method="POST">
    <p>ブログタイトル</p>
    <input type="text" name="title">
    <p>ブログ本文</p>
    <textarea name="content" id="content" cols="30" rows="10"></textarea>
    <br>
    <input type="submit" value="送信">
  </form>
</body>
```

**blog.php**に👇のように記載して送信ボンタンを押す。

```php
$blog = $_POST;

var_dump($blog);
```

データが送られているか確かめる。

**array(2) { ["title"]=> string(6) "映画" ["content"]=> string(27) "たのしかったです。" }**

送られていれば☝のようになる。

###②配列でデータが入っていることが確認できたので取り出す

ループ処理の**foreach**を使用する。
👇

```php
$blog = $_POST;

foreach ($blog as $key => $value) {
  echo '<pre>';
  echo $key . ':'. $value;
  echo '<pre>';
}
```
結果
**title:映画**
**content:おもしろかった。**

###フォームのセキュリティ
なぜ必要か？
受け取った値には、特殊文字のエンコードが必要
**理由：悪意あるスクリプト送信を防ぐため**

例えばブログ本文に
![投稿フォーム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631322/50502381-f068-b191-6f34-10a9438bcb92.png)

と記載して送信すると
![投稿フォーム_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631322/e803a06d-e0c9-b550-bb99-841ded53e470.png)
☝のようにhtmlのh1タグが反映されてしまう。

そういうのを防ぐためタグとはみなさない処理が必要。

**htmlspecialchars(値,フラグ,文字コード)**
<フラグの種類>
・ENT_CONPAT（初期値）：ダブルクォートのみ変換
**・ENT_QUOTES：ダブル、シングルクォートを変換**
・ENT_NOQUOTES：両方とも変換しない
**※ほとんど真ん中を使用する。**

```php
foreach ($blog as $key => $value) {
  echo '<pre>';
  echo $key . ':'. htmlspecialchars($value,ENT_QUOTES,'UTF-8');
  echo '<pre>';
}
```
送信すると
![投稿フォーム_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631322/6488226a-4a41-bae4-fed1-042c3b5c80d7.png)
☝
エンコードして文字として出力される。

###投稿したブログをif文で公開状態か非公開状態か判定して実際に画面表示するかしないか判定する

**form.html**に公開、非公開のボタンを用意する。

```html
<input type="radio" name="publish_status" value="publish" checked>公開
<input type="radio" name="publish_status" value="un_publish">非公開
```
☝checkedとは初期状態で公開にチェックをつけたい場合にい使用しる。

**blog.php**にif文を記載する。

```php
if($blog['publish_status'] === 'un_publish') {
  return;
}
```
もしpublish_statusがun_publishi（非公開）なら
return（次の処理は行わず返す）

これで公開して送信すれば表示される。
非公開で送信すると何も表示されない。

####非公開の時に「公開中の記事がありません。」表示させる。

```php
if($blog['publish_status'] === 'publish') {
  foreach ($blog as $key => $value) {
  echo '<pre>';
  echo $key . ':'. htmlspecialchars($value,ENT_QUOTES,'UTF-8');
  echo '<pre>';
  } 
} else {
  echo '公開中の記事がありません。';
}
```

publish（公開）の場合はforeach文が実行され、
それ以外の場合は「公開中の記事がありません。」と表示される。

**※追加で条件し増やしたいときはelseifを使用する。**

###HTMLへ埋め込み
form.htmlに「投稿日」「カテゴリ」をついかする。

```html
<p>投稿日：</p>
<input type="date" name="post_at">
<br>
<p>カテゴリ：</p>
<select name="category">
  <option value="ゲーム">ゲーム</option>
  <option value="映画">映画</option>
  <option value="雑記">雑記</option>
</select>
```
#####blog.phpをもう少し投稿されてるような感じにする
👇HTML内で、PHPを使いたい箇所を<?php ~~ ?>で囲んで記述する。
更にセキュリティを強化するために
**htmlspecialchars**を追記する。

```php
<body>
  <h2><?php echo htmlspecialchars($blog['title'],ENT_QUOTES,'UTF-8'); ?></h2>
  <p>投稿日：<?php echo htmlspecialchars($blog['post_at'],ENT_QUOTES,'UTF-8'); ?></p>
  <p>カテゴリ：<?php echo htmlspecialchars($blog['category'],ENT_QUOTES,'UTF-8'); ?></p>
  <hr>
  <p><?php echo htmlspecialchars($blog['content'],ENT_QUOTES,'UTF-8'); ?></p>
</body>
```

####改行を反映させる
この段階だとブログ本文で改行して公開しても改行されてない状態なので
改行できるように関数を使用する。
**nl2br** 改行をHTMLの**br**に変換してくれる。
👇本文の部分追記

```php
<p><?php echo nl2br(htmlspecialchars($blog['content'],ENT_QUOTES,'UTF-8')); ?></p>
```

ここまでで投稿フォームは完成。
この段階ではデータを送っただけでどこにも保存されません。
次からはデータベースに投稿したブログを保存してそれを表示できるようにする。