PHP基礎②

#はじめに
本日もPHPも学習を続けていきますので、こちらでアウトプットしていきます。

#フォームから受け取る処理

###フォームの入力から受け取る①

```index.html
<form action="submit.php" method="get">
        <label for="my_name">お名前：</label>
        <input
          type="text"
          id="my_name"
          name="my_name"
          maxlength="255"
          value=""
        />
        <input type="submit" value="送信" />
      </form>
```

```sample.php

<pre>
お名前：<?php
 print(htmlspecialchars($_REQUEST['my_name']/*ここはname属性に揃える*/,ENT_QUOTES));
?>
</pre>
```

参考:https://www.php.net/manual/ja/reserved.variables.request.php
第二引数については[こちら](https://www.php.net/manual/ja/function.htmlspecialchars.php)をご覧ください

htmlspecialcharsは、フォームに悪意のあるプログラムを入力したときに、それが反映されないようにする効果があります。

###ラジオボタン,チェックボックス,ドロップボタンの場合

まずはラジオボタンについてみていきます。

```index.htm

<form action="submit.php" method="post">
    #ラジオボタン
    <p>性別：
        <input type="radio" name="gender" value="男性"> 男性
        ／
        <input type="radio" name="gender" value="女性"> 女性
    </p>
    <input type="submit" value="送信する">
</form>
```
実は受け取り方は上述したパターンと同じになります。

```submit.php
<pre>
　　#ラジオボタンの情報を受け取る
    <?php print(htmlspecialchars($_POST['gender'], ENT_QUOTES)); ?>
</pre>

```

###複数選択可能なチェックボックスやドロップボタン

複数選択可能な場合は、name属性にブラケットを記述する必要があります。

```index.html
<form action="submit.php" method="post">
    <p>ご予約希望日</p>
    <p>

        <input type="checkbox" name="reserve[]" value="1/1"> 1月1日<br>
        <input type="checkbox" name="reserve[]" value="1/2"> 1月2日<br>
        <input type="checkbox" name="reserve[]" value="1/3"> 1月3日<br>
    </p>
    <input type="submit" value="送信する">
```

php側で複数情報をforeachで展開していきます。

```submit.php
<pre>
    <?php
    foreach ($_POST['reserve'] as $reserve) {
        print(htmlspecialchars($reserve, ENT_QUOTES) . ' ');
    }
    ?>
</pre>
```

ドロップボタンでも同様の記述をします。


#全角数字を半角数字に直す

```sample.php
<pre>
    <?php
    $age = '20';

    $age = mb_convert_kana($age, 'n', 'UTF-8');
    if (is_numeric($age)) {
        print($age . '歳');
    } else {
        print('※ 年齢が数字ではありません');
    }
    ?>
</pre>
```
is_numeric($age)で受け取った情報が数字かどうか確認します。
mb_convert_kanaでは、さまざな変換を行います。今回は数字を全角数字を半角数字に変換してあげます。なお、mb_convert_kanaの詳細については、以下の参考をご覧ください

参考:https://www.php.net/manual/ja/function.mb-convert-kana.php


#郵便番号を赤表現でチェック

preg_matchというメソッドを使用して、正規表現によるマッチングを行います。
正規表現については、省略します。

```sample.php
<pre>
    <?php
    $zip = 'abcabc123-4567';

    $zip = mb_convert_kana($zip, 'a', 'UTF-8');#半角へ変換
    if (preg_match("/\A\d{3}[-]\d{4}\z/", $zip)) {
        print('郵便番号：〒' . $zip);
    } else {
        print('※ 郵便番号を 123-4567の形式でご記入ください');
    }
    ?>
</pre>
```

#別ページへジャンプ

header() は、生の HTTP ヘッダを送信するために使用されます。
使われ方は様々ありますが、今回は別ページで遷移する場合の処理です。

```sample.php
<?php
header('Location: https://h2o-space.com');
exit();

```

Locationで別ページに飛ぶことを指示していて、そのあとジャンプ先を提示しています。

#剰余算の活用

剰余算を使って、文字の後ろに色をつけたりするプログラムを書きます

```sample.php
<table>
    <?php
    for ($i=1; $i<=100; $i++) {
        if ($i % 2) {
            print('<tr style="background-color: #ccc">');
        } else {
            print('<tr>');
        }
        print('<td>' . $i . '行目</td>');
        print('</tr>');
    }
    ?>
</table>
```

まあ、至って普通のプログラムですが、個人的な発見としてはprintを使わないと、<tr style="background-color: #ccc">が反映されないということですね。
まあ考えてみれば当たり前ですが、Railsのerbに慣れていると、書かなくてもなんかいけてしまうような感じがあるんですよね。。

#Cookieに値を保存する

Cookie（クッキー）とは、ホームページを訪問したユーザーの情報を一時的の保存する仕組み、またはそのデータです。そのCookieに値を保存するにはsetcookieを使います。
第一引数にキー、第二引数に値,第三引数に保存期間を指定します。
保存期間は今回は、現時点の時間〜14日後にしています。

```index.php
<?php
$value = '変数に保存した値です';
setcookie('save_message', 'Cookieに保存した値です', time() + 60 * 60 * 24 * 14);
?>
```

ちなみにCookieの値は以下のように取り出します

```sample.php
<pre>
    変数の値：<?php print($value); ?>  #この部分は表示されない、あくまでこのページでのvalueとして再定義しないといけない
    Cookieの値：<?php print($_COOKIE['save_message']); ?>　#前ページから保存されたものがこちらでも表示される
</pre>
```
#sessionに値を保存する

以下のページでsessionを保存します。

```index.php

<?php
session_start();
$_SESSION['session_message']="sessionに値を保存しました"

?>
```
そして、記憶した値をこちらで表示します。

```sample.php
<?php
 print($_SESSION['sesison_message']); #sessionに値を保存しましたが表示される
?>
```

**sessionはCookieと違って、ブラウザを閉じてしまうと一旦保存したsessionの情報は消えてしまいます。**

ちなみに、sessionはサーバ側で記憶するのに対して、Cookieはブラウザ側で記憶されます。

#おわりに

一旦ここまでざっとPHPの簡単な基礎について学びました。
一度プログラミングを知っていると、初学であってもかなりすっと対応できるなと感じました。
ここからさらに基礎を深めていきたいと思います。