同じページを表示させたいけれど、違うカテゴリでController内の処理を使い分けたい時がありました。
例えばViewはこんな感じです。
<ul class="list-disc">
<li><a href="fruit.php" class="text-blue-500">りんご</a></li>
<li><a href="fruit.php" class="text-blue-500">みかん</a></li>
<li><a href="fruit.php" class="text-blue-500">バナナ</a></li>
</ul>そんな時はGETパラメータを使って処理を記述していくのがベストということに気が付きました。
Viewで「GETパラメータ」を記述する
<ul class="list-disc">
<li><a href="fruit.php?type=ringo" class="text-blue-500">りんご</a></li>
<li><a href="fruit.php?type=mikan" class="text-blue-500">みかん</a></li>
<li><a href="fruit.php?type=banana" class="text-blue-500">バナナ</a></li>
</ul>上記で言うと、fruit.phpの後に「?type=〇〇」と付いていますね。
phpの後に「?」を付けるとGETパラメータとして受け取ることが出来るようです。
もし、複数のGETパラメータを受け取りたい場合は下記のようにパラメータ間に「&」を付ければ送信されました。
<ul class="list-disc">
<li><a href="fruit.php?type=ringo&color=red" class="text-blue-500">りんご</a></li>
<li><a href="fruit.php?type=mikan&color=orange" class="text-blue-500">みかん</a></li>
<li><a href="fruit.php?type=banana&color=yellow" class="text-blue-500">バナナ</a></li>
</ul>ControllerでGETパラメータを受け取る
先ほど「?type=〇〇」で受け取ったGETパラメータは $_GET_「’type’」; と書きます。
この $_GET[‘type’] の中身がクリックされた<a>タグに応じて、 ringo、mikan、banana が入っています。
その受け取ったGETパラメータをパラメータ別に処理を書いてViewを表示させます。
public function fruit()
{
$type = $_GET['type'];
switch ($type) {
case 'ringo':
...
break;
case 'mikan':
...
break;
case 'banana':
...
break;
default:
...
}
require __DIR__ . '/../Views/fruit.php';
}また、GETパラメータが空の場合、下記のように書くこともできるようです。
// パラメータが空の場合、「ringo」を変数に入れる
$type = $_GET['type'] ?? 'ringo';URL直打ち対策
URLを直打ちされてしまった時等、GETパラメータが予期しないものが入力されてしまった場合等のために対策を行うことにしました。
その前にURL直打ちってどういうことって言ったら<a>タグをクリックせずに、
下記のようなURLを直接書いてアクセスしてしまうことです。

上記でいうと &type=suika の部分です。
suika はControllerの処理に書いていないよ!という事態が発生することも考えられます。
という感じで、勝手に許可していないGETパラメータをURLから指定してアクセスされるのを阻止する処理を書きます。
許可するGETパラメータを配列として持たせて、受け取ったGETパラメータがその配列内にあるかどうかを確かめるために
in_array()関数を使ってチェックします。
$allowedTypes = ['ringo', 'mikan', 'banana']; // 許可するGETパラメータの配列
$type = $_GET['type'] ?? 'ringo';
// 不正な type が来た場合
if (!in_array($type, $allowedTypes, true)) {
$type = 'ringo'; // デフォルトに戻す
}デフォルトに戻すのではなく、元のページにリダイレクトしてしまうのも1つの手です。
(個人的にはこれが一番好き)
// 不正な type が来た場合
if (!in_array($type, $allowedTypes, true)) {
header('Location: /index.php');
exit;
}不正なURLとしてはじいてしまいたい場合は404としてしまうこともアリです。
if (!in_array($type, $allowedTypes, true)) {
http_response_code(404);
require __DIR__ . '/../Views/errors/404.php';
exit;
}今回のまとめ
今回はGETパラメータについて調べました。
参考になれば嬉しいです!
