sit in a circle and chat happily

PHP 6日目

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

GET形式の送受信おさらい

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

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

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

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

ctype_digit:数字かどうかを調べる(教科書外の内容)

★与えられた文字列 text のすべての文字が 数字であるかどうかを調べる

echo '100<br>';
var_dump(ctype_digit(100)); //false
// 引数が文字列型じゃない:NG
// 数値型はfalse
echo '<br>「100」<br>';
var_dump(ctype_digit('100')); //true
// 引数が文字列型:OK
// すべての文字列が数字になる:OK
echo '<br>「aaa」<br>';
var_dump(ctype_digit('aaa')); //false
// 引数が文字列型:OK
// すべての文字列が数字になる:NG
echo '<br>0.5<br>';
var_dump(ctype_digit(0.5)); //false
// 引数が文字列型:NG
// 数値型はfalse
echo '<br>「0.5」<br>';
var_dump(ctype_digit('0.5')); //false
// 引数が文字列型:OK
// すべての文字列が数字になる:NG
//  ※小数点「.」が数字でないため

// 【ctype_digitの3つのチェック】
// ・文字列型チェック
// ・文字と数字のチェック
// ・小数をNGとして整数チェック
      <form action="page.php" method="get">
        <h1>キャラクター選択</h1>
        <h2>敵を選択</h2>
        <select name="enemy_id">
          <option value="">選択してください</option>
          <option value="0">バラモス</option>
          <option value="1">ゾーマ</option>
          <option value="2">デスピサロ</option>
        </select>

        <h2>プレイヤーを選択</h2>
        <select name="player_id">
          <option value="">選択してください</option>
          <option value="0">ライアン</option>
          <option value="1">クリフト</option>
          <option value="2">アリーナ</option>
        </select>
        <p class="decision">
          <input type="submit" value="表示">
        </p>
      </form>
<?php
// 問題1
// 受け取った値の連想配列情報を表示すること
echo '<pre>';
var_dump($_GET);
echo '</pre>';

// 問題2
// プレイヤーの情報を画面に表示すること
// 1.送信画面にセレクトボックスを作成
// 2.受け取った値でプレイヤーの情報を画面に表示


// 問題3
// 予想外の値や不正な値が届いた時に
// 適切なエラーメッセージを表示すること
$playerList = [
  [
    'name' => 'ライアン',
    'life' => 500,
    'aliveImg' => 'img/p_01.gif',
  ],
  [
    'name' => 'クリフト',
    'life' => 400,
    'aliveImg' => 'img/p_02.gif',
  ],
  [
    'name' => 'アリーナ',
    'life' => 450,
    'aliveImg' => 'img/p_03.gif',
  ],
];
$enemyList = [
  [
    'name' => 'バラモス',
    'life' => 3500,
    'aliveImg' => 'img/e_01.gif',
  ],
  [
    'name' => 'ゾーマ',
    'life' => 4000,
    'aliveImg' => 'img/e_02.gif',
  ],
  [
    'name' => 'デスピサロ',
    'life' => 4500,
    'aliveImg' => 'img/e_03.gif',
  ],
];

// 処理:敵を表示/プレイヤーを表示

// 送信された値が正しい値かチェックする
// 送信される値は改ざんによる不正な値の場合があるので必ずチェックする

$error = [];
// エラーメッセージ用配列を作成する
// エラーがあれば部屋を作ってメッセージを入れる
// 部屋が0であれば「不正なし」
// 部屋が1つ以上あれば「不正あり」

// 【選択系パーツで考えられるエラー】
// 1.値が届かない
// 2.値を選択していない
// 3.値が改ざんされている
//  「範囲を逸脱した値」や「型が違う」
// 正しい値は「0」「1」「2」
// 不正な値:「空文字」「数字じゃない」
//  数字かどうかを調べる関数「ctype_digit関数」
// ctype:キャラクタータイプ「文字列型」
// digit:「数字」
// 引数の値が「文字列型」かつ「数字」かどうかをチェック
if (isset($_GET['enemy_id'])) {
  // 値が届いた時の処理
  $enemy_id = $_GET['enemy_id'];
  // 書きやすいように変数に値を代入する
  if (ctype_digit($enemy_id)) {
    // 届いた値が数字の時の処理
    if ($enemy_id < 0 || $enemy_id > 2) {
      // 届いた値が数字で、範囲外の時の処理
      $error[] = '3.敵の値が不正です';
    }
  } else {
    // 届いた値が数字じゃない時の処理
    $error[] = '2.敵の値が選択されていないか不正です';
  }
} else {
  // 値が届かなかった時の処理
  $error[] = '1.敵の値が届いていません';
}

if (isset($_GET['player_id'])) {
  $player_id = $_GET['player_id'];
  if (ctype_digit($player_id)) {
    if ($player_id < 0 || $player_id > 2) {
      $error[] = '3.プレイヤーの値が不正です';
    }
  } else {
    $error[] = '2.プレイヤーの値が選択されていないか不正です';
  }
} else {
  $error[] = '1.プレイヤーの値が届いていません';
}

// echo '100<br>';
// var_dump(ctype_digit(100)); //false
// // 引数が文字列型じゃない:NG
// // 数値型はfalse
// echo '<br>「100」<br>';
// var_dump(ctype_digit('100')); //true
// // 引数が文字列型:OK
// // すべての文字列が数字になる:OK
// echo '<br>「aaa」<br>';
// var_dump(ctype_digit('aaa')); //false
// // 引数が文字列型:OK
// // すべての文字列が数字になる:NG
// echo '<br>0.5<br>';
// var_dump(ctype_digit(0.5)); //false
// // 引数が文字列型:NG
// // 数値型はfalse
// echo '<br>「0.5」<br>';
// var_dump(ctype_digit('0.5')); //false
// // 引数が文字列型:OK
// // すべての文字列が数字になる:NG
// //  ※小数点「.」が数字でないため

// // 【ctype_digitの3つのチェック】
// // ・文字列型チェック
// // ・文字と数字のチェック
// // ・小数をNGとして整数チェック
?>
<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="css/style.css">
</head>

<body>
  <div class="box">
    <div class="inner">
      <?php if (count($error) > 0) : ?>
        <h1>エラー</h1>
        <ul class="error">
          <?php foreach ($error as $val) : ?>
            <li><?php echo $val; ?></li>
          <?php endforeach; ?>
        </ul>
      <?php else : ?>
        <h1>敵</h1>
        <div class="name">
          名前:<?php echo $enemyList[$enemy_id]['name'] ?>
        </div>
        <div class="life">
          ライフ:<?php echo $enemyList[$enemy_id]['life'] ?>
        </div>
        <div class="img">
          <img src="<?php echo $enemyList[$enemy_id]['aliveImg'] ?>">
        </div>

        <h1>プレイヤー</h1>
        <div class="name">
          名前:<?php echo $playerList[$player_id]['name'] ?>
        </div>
        <div class="life">
          ライフ:<?php echo $playerList[$player_id]['life'] ?>
        </div>
        <div class="img">
          <img src="<?php echo $playerList[$player_id]['aliveImg'] ?>">
        </div>

    </div>
  <?php endif; ?>
  </div>
  </div>
</body>

</html>
カテゴリー