PHPだけで簡単なおみくじを作ってみた

---

※2020/9/6追記
@il9437 さんより、各コードをより簡素にし、正規の画面遷移であるかのチェックを追加するコメント頂きましたので、是非[コチラ](https://qiita.com/_Taturon_/items/80158d792e66cad0d3df#comments)もご参照下さい！

※2020/10/17追記
GitHubでのソースコードは[こちら](https://github.com/Taturon/Fortune_Telling)

---

#概要

非常に簡単な機能です。

まず、初期画面に「おみくじを引く」ボタンがあり、
![初期画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598695/aa5dedb7-5a02-98b1-9a85-0fc0bc143de5.png)
ボタンを押すと、7つあるくじのうちの一つがランダムに引かれ、結果が表示されます。
![結果画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598695/b0367f53-d9ca-cb24-1516-5f2798baad5c.png)
結果の詳細をクリックすると、くじに応じたコメントが表示されます。
![詳細画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598695/2d271c82-cc3d-18be-6241-55e1dbc24e0a.png)

#実装
動作確認環境：PHP7.1.29
##初期画面
まず初期画面を実装します。

```html:start.php
<!DOCTYPE html>
<html lang="ja">
	<head>
		<meta charset="UTF-8">
		<title>おみくじ</title>
	</head>
	<body>
		<h1>おみくじ</h1>
		<h2>おみくじを引いて今日の運勢を占ってみよう！</h2>
		<form action="fortune.php" method="POST">
			<input type="submit" name="btn" value="おみくじを引く">
		</form>
	</body>
</html>
```
一つのフォームがあるだけの簡単なページです。
クリックすると、「fortune.php」へ飛ばされます。
##結果画面
結果画面へアクセスされると、ランダムにくじが引かれ、その結果が表示されます。

```php:fortune.php
<?php
$lots = [1, 2, 3, 4, 5, 6, 7];
if (isset($_POST['btn'])) {
	$lot = array_rand($lots);
	switch ($lot) {
		case 0:
			$res = '大吉';
			$num = 1;
			break;
		case 1:
			$res = '中吉';
			$num = 2;
			break;
		case 2:
			$res = '小吉';
			$num = 3;
			break;
		case 3:
			$res = '吉';
			$num = 4;
			break;
		case 4:
			$res = '半吉';
			$num = 5;
			break;
		case 5:
			$res = '末吉';
			$num = 6;
			break;
		case 6:
			$res = '凶';
			$num = 7;
	}
} else {
	header('Location:button.php');
	exit();
}
?>
<!DOCTYPE html>
<html lang="ja">
	<head>
		<meta charset="UTF-8">
		<title>おみくじ</title>
	</head>
	<body>
		<h1>結果</h1>
		<h2><?= $res; ?></h2>
		<p>
			<a href="detail.php?num=<?= $num; ?>">結果の詳細</a>
		</p>
		<p>
			<a href="button.php">
				<button type="button">もう一度おみくじを引く</button>
			</a>
		</p>
	</body>
</html>
```
else文内の処理によって、「おみくじを引く」ボタンを押さずに（値をPOSTせずに）やって来たアクセスを、初期画面へと弾いています。

くじを引く処理は、1から7の値が入った配列を作り、その配列から**array_rand**によってランダムにキーを取り出し、その値によって結果を分岐させています。

注意点として、「array_rand」は**値を取り出しているのではなくキーを取り出しています**。

> array_rand — 配列から一つ以上のキーをランダムに取得する
引用元：[PHPマニュアル array_rand](https://www.php.net/manual/ja/function.array-rand.php)

この為、続くswitch文のcase文では0から値が始まっています。

また、結果によって変数$numに数値を代入し、それを**URLパラメータに加えたリンク**を生成することで、詳細ページ内容を分岐させます。
##詳細画面
URLパラメーターから値を取得し、それにより表示させるコメントを変化させています。

```php:detail.php
<?php
if (isset($_GET['num']) && $_GET['num'] < 8 && $_GET['num'] > 0) {
	$num = $_GET['num'];
	switch ($num) {
		case 1:
			$res = '絶好調の運勢！';
			break;
		case 2:
			$res = '今日という日に期待大！';
			break;
		case 3:
			$res = 'ちょっといいことあるかも！';
			break;
		case 4:
			$res = 'ラッキー！';
			break;
		case 5:
			$res = '末吉よりはいいかも';
			break;
		case 6:
			$res = '一応吉だよ';
			break;
		case 7:
			$res = 'ダメだったらやり直せばええんやで';
	}
} else {
	header('Location:button.php');
	exit();
}
?>
<!DOCTYPE html>
<html lang="ja">
	<head>
		<meta charset="UTF-8">
		<title>おみくじ</title>
	</head>
	<body>
		<h1>結果の詳細</h1>
		<h2><?= $res; ?></h2>
		<p>
			<a href="button.php">
				<button type="button">もう一度おみくじを引く</button>
			</a>
		</p>
	</body>
</html>
```
このページでは、
「**『num』をキーとしたGETパラメータがある**」
かつ
「**そのGETパラメータが1〜7の範囲内**」
の場合のみ処理が走るようにしています。

...実は少々穴があり、GETパラメータに「2.2」など範囲内の整数以外の数値を入れるとアクセスできてしまいます...

これを防ぐのに良いアドバイスとかコメント頂けたら喜びます！

---
※2020/9/6追記
[コメント](https://qiita.com/_Taturon_/items/80158d792e66cad0d3df#comments)にてこれを防ぐ方法をご教授いただいております！

また、自分でも考えてみたのですが、
条件式を下記に変更することで範囲内の整数以外を弾けるようになりました。

```php:detail.php
<?php
if (isset($_GET['num']) && in_array($_GET['num'], range(1, 7)) {

// 中略

}
```
下記もご参考までに。

PHPマニュアル「[PHP: in_array](https://www.php.net/manual/ja/function.in-array)」
PHPマニュアル「[PHP: range](https://www.php.net/manual/ja/function.range.php)」

#あとがき
今回は学んだ知識のアウトプットの一環として、0から処理を書いてみました。
何か不備などございましたら、コメント頂けると幸いです。