sit in a circle and chat happily

PHP 7日目

投稿日:2022-01-21
更新日:2022-03-24
php

GET形式の送受信おさらい

mb_strlen:文字数を調べる(教科書外の内容)

★引数で指定した文字列の文字数を返す
  (JSでのlengthプロパティ)

mb_strlen:公式説明

mt_・・・ → マルチバイト

var_dump(strlen('あ')); // 3
// バイト数を返してる
// 日本語は1文字「2~4バイト」
echo '<br>';
var_dump(mb_strlen('あ')); // 1
echo '<br>';
/*
関数に「mb_」がついている場合はマルチバイト文字に対応した関数
日本語はマルチバイト文字なので
文字関係の処理で挙動がおかしいときは
マルチバイト文字対応関数がないか調べる
*/
      <form action="page.php" method="get">
        <h1>入力パーツ</h1>
        <dl>
          <dt>テキストボックス</dt>
          <dd>
            <input type="text" name="test01">
          </dd>
          <dt>テキストエリア</dt>
          <dd>
            <textarea name="test02" cols="30" rows="10"></textarea>
          </dd>
        </dl>
        <input type="submit" value="送信">
      </form>
// GET形式の値を受け取るので「$_GET」を利用する
// 「$_GET」を利用する
// 受け取った値を確認するため表示
echo '<pre>';
echo var_dump($_GET);
echo '</pre>';
// ユーザ入力値チェック
$error = [];
// テキストボックスチェック
// 1.値が届いているか(必須)
// 2.値が空文字じゃないか(省略可)
// 3.上限値を超えていないか(推奨)
$limit = 10; // 上限値
if (isset($_GET['test01'])) { //1.チェック
  $test01 = $_GET['test01'];
  if ($test01 === '') { //2.チェック
    $error[] = 'テキストボックスが未入力です';
  } else if (mb_strlen($test01) > $limit) { //3.チェック
    // mb_strlen関数
    // 引数で指定した文字列の文字数を返す
    //  ※JSの文字列に対するlengthプロパティと同じような内容
    $error[] = "テキストボックスは{$limit}文字以下で入力してください";
  } // 本来はココに「エラーがないときの処理」をelseで記述するが
    // 「何も処理をしない」ので、省略している
} else {
  $error[] = 'テキストボックスの値が届いていません';
}
// テキスエリアチェック
$limit = 100;
if (isset($_GET['test02'])) {
  $test02 = $_GET['test02'];
  if ($test02 === '') {
    $error[] = 'テキストエリアが未入力です';
  } else if (mb_strlen($test02) > $limit) {
    $error[] = "テキストエリアは{$limit}文字以下で入力してください";
  }
} else {
  $error[] = 'テキストエリアの値が届いていません';
}

var_dump(strlen('あ')); // 3
// バイト数を返してる
// 日本語は1文字「2~4バイト」
echo '<br>';
var_dump(mb_strlen('あ')); // 1
echo '<br>';
/*
関数に「mb_」がついている場合はマルチバイト文字に対応した関数
日本語はマルチバイト文字なので
文字関係の処理で挙動がおかしいときは
マルチバイト文字対応関数がないか調べる
*/

POST形式の値を送信

HTMLの入力フォームからPOST形式で値を送信することができる。

POST形式で送信

form要素内のsubmitボタンが押下されるとaction属性で指定したページにmethod属性で指定した形式で値を送信する。

  <form action="02-2_post_confirm.php" method="post">
    <h2>性別は?</h2>
    <label><input type="radio" name="gender" value="1">男性</label>
    <label><input type="radio" name="gender" value="2">女性</label>

    <h2>年齢は?</h2>
    <select name="age">
      <option value="" selected>選択してください</option>
      <option value="1">10代</option>
      <option value="2">20代</option>
      <option value="3">30代</option>
      <option value="4">40代</option>
      <option value="5">50代以上</option>
    </select>

    <p>
      <input type="submit" value="投票する">

POST形式で値を送信

◆リクエストボディを使って送信
ブラウザとWebサーバが通信をしてWebページを表示する。その際、ブラウザから「このページを見たい」とWebサーバに依頼を出す通信が「リクエスト」、そのリクエストに応えてサーバからブラウザに返す通信が「レスポンス」になる。

「リクエスト」は「リクエストヘッダ」と「リクエストボディ」で構成されていて、POST形式の場合は「リクエストボディ」を使用して入力データが送信される。
POSTで送信した値はChromeの検証ツール「Network」タブで確認できる。

◆情報量の制限について
基本的に情報量に制限はないが、不当に大きなリクエストを受け付けないようにサーバ側でブロックしている場合もある。

◆POST形式が使われる場面
通常のフォームでは値がアドレス欄に表示されないPOST形式を使用する。

◆【まとめ】POST形式について◆
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
リクエストボディを使って見えないところで値を送信する方法

◇メリット
・第三者に値を盗み見られる可能性が低くなる
・改ざんされにくい
・送信する値の上限がない(サーバが上限を設けている場合がある)

◇デメリット
・第三者と値を共有できない

◇使いどころ
・「お問い合わせ」や「アンケート」、「個人情報の入力」等

POST形式で送信した値の確認方法

POST形式で送信された値はブラウザの標準機能では確認できない。Chromeの検証ツールを使用して確認する。

POST形式の値を取得

HTMLの入力フォームから送られてきたPOST形式の値をPHPで受け取ることができる。

POST形式で受け取った値

$_POST

入力フォームからPOST形式で送られてきた値をPHPで取得する場合、スーパーグローバル変数(スクリプト内のどこからでも参照できる変数)である「$_POST」を使用する。

POST形式で受け取った値を利用する

$_POST['name属性値']

$_POSTは受け取った値を連想配列で管理する。キーは受信した値の名前(name属性で指定した属性値)になる。

変数が定義されているか調べる:isset命令

「isset($_POST[‘gender’])」は「$_POST[‘gender’]」があるか調べる。もし存在すれば「true」を返し、存在しなければ「false」を返す。

【値の送受信:まとめ】
◆GET形式について◆
^^^^^^^^^^^^^^^^^^
URLにクエリ文字列を追加して値を送信する方法

◇メリット
・フォームを使わなくても値を送信できる
  ※リンクにクエリ文字列を付与して送信できる
・URLに値が付与されているので、URLと値を第三者と共有できる
  ※クエリ文字列付きURLを他の人に送って、値ごとURLを共有できる

◇デメリット
・URLを使うため送れる値の量に制限がある
・URLを見れば送った値がわかる
・送る値を改ざんされやすい

◇使いどころ
・ID番号を使ってテンプレート表示
  ※テンプレートで商品の詳細を表示する
    テンプレートでレシピの詳細を表示する
・検索キーワードをURLに付加した検索結果ページ

◆POST形式について◆
^^^^^^^^^^^^^^^^^^
リクエストボディを使って見えないところで値を送信する方法

◇メリット
・第三者に値を盗み見られる可能性が低くなる
・改ざんされにくい
・送信する値の上限がない(サーバが上限を設けている場合がある)

◇デメリット
・第三者と値を共有できない

◇使いどころ
・「お問い合わせ」や「アンケート」、「個人情報の入力」等
<?php
echo '<pre>';
var_dump($_POST);
echo '</pre>';

$error = [];
// 名前チェック(必須)
// 届いてるか、空文字じゃないか、20文字以内か
$limit = 20;
if (isset($_POST['myname'])) {
  $myname = $_POST['myname'];
  if ($myname === '') {
    $error[] = '名前が未入力です'; //空文字だった時のエラー
  } else if (mb_strlen($myname) > $limit) {
    $error[] = "名前は{$limit}文字以下で入力してください";
  }
} else {
  $error[] = '名前の値が届いていません';
}

// メアドチェック(必須じゃない)
// 届いているか、100文字以内か
// テキストボックスの必須かどうかの確認 → 空文字チェック
// 「必須じゃない」ため、空文字チェックが不要
$limit = 100;
if (isset($_POST['mail'])) {
  $mail = $_POST['mail'];
  if (mb_strlen($_POST['mail']) > $limit) {
    $error[] = "メールアドレスは{$limit}文字以下で入力してください";
  }
} else {
  $error[] = "{$check}の値が届いていません"; //「空文字」と、届いていない、は別
}

// 性別チェック
// 未選択は「値なし」
// OKルート:「値届いていない」「範囲内の数字」
// ・届いているかチェック(届いていなくてもエラーではなくOK)
// ・数字チェック
// ・範囲チェック(0~2)
if (isset($_POST['gender'])) {
  $gender = $_POST['gender'];
  if (ctype_digit($gender)) {
    if ($gender < 0 || $gender > 2) {
      $error[] = '性別の値が不正です';
    }
  } else {
    $error[] = '性別の値が不正です';
  }
}
// 表示するときに変数がないので
// 表示用変数を別途用意する

// 年代チェック
// 未選択は空文字
// OKルート:「空文字」「範囲内の数字」
// ・届いているか
// ・空文字じゃないか(空文字でもエラーではなくOK)
// ・数字チェック
// ・範囲チェック(0~5)
if (isset($_POST['age'])) {
  $age = $_POST['age'];
  if ($age !== '') {
    if (ctype_digit($gender)) {
      if ($age < 0 || $age > 5) {
        $error[] = '年代の値が不正です';
      }
    } else {
      $error[] = '年代の値が不正です';
    }
  }
} else {
  $error[] = '年代の値が届いていません';
}

// Qチェック
// 届いてるか、空文字じゃないか、20文字以内か
$limit = 400;
if (isset($_POST['body'])) {
  $body = $_POST['body'];
  if ($body === '') {
    $error[] = 'お問い合わせ内容が未入力です';
  } else if (mb_strlen($body) > $limit) {
    $error[] = "お問い合わせ内容は{$limit}文字以下で入力してください";
  }
} else {
  $error[] = 'お問い合わせ内容の値が届いていません';
}

if (count($error) === 0) {
  $genderList = [
    '選択しない',
    '男性',
    '女性',
  ];
  if (isset($gender)) {
    // 性別の値が届いたとき
    $genderStr = $genderList[$gender];
  } else {
    // 性別の値が届いていないとき
    // $genderが存在しないとき
    $genderStr = '未選択です';
  }

  if ($age === '') {
    $ageStr = '未選択です';
  } else if ($age === '0') {
    $ageStr = '未回答';
  } else if ($age === '1') {
    $ageStr = "{$age}0代以上";
  } else {
    $ageStr = "{$age}0代";
  }
}
?>
<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>おさらい|POST形式</title>
</head>

<body>
  <div class="box">
    <div class="inner">
      <h1>おさらい(POST)</h1>
      <?php if (count($error) > 0) : ?>
        <h1>エラー</h1>
        <ul class="error">
          <?php foreach ($error as $val) : ?>
            <li><?php echo $val; ?></li>
          <?php endforeach; ?>
        </ul>
        <p>
          <a href="javascript:void(0);" onclick="history.back();">
            フォームに戻る:JS
          </a>
        </p>
      <?php else : ?>
        <dl>
          <dt>名前</dt>
          <dd>
            <?php echo $myname; ?>
          </dd>
          <dt>メールアドレス</dt>
          <dd>
            <?php echo $mail; ?>
          </dd>
          <dt>性別</dt>
          <dd>
            <?php echo $genderStr; ?>
            <?php
            /* <?php if (isset($_POST['gender'])) : ?>
              <?php echo $_POST['gender']; ?>
            <?php else : ?>
              <?php echo '未回答です'; ?>
            <?php endif; ?>
             */
            ?>
          </dd>
          <dt>年代</dt>
          <dd>
            <?php echo $ageStr; ?>
          </dd>
          <dt>お問い合わせ内容</dt>
          <dd>
            <?php echo nl2br($body); ?>
            <?php
            /*
            nl2br関数(New Line to br)
            改行コード前にbr要素を挿入してくれる
            ブラウザ画面上で改行をサポートしてくれる
            テキストエリアの内容を表示するときによく使う
             */
            ?>
          </dd>
        </dl>
      <?php endif; ?>
    </div>
  </div>
</body>

</html>
カテゴリー