PHPstep

トップページ > PHPで占いプログラムを作ろう >

第二章 PHPでウェブアプリケーションを作ろう

PHPで占いプログラムを作ろう5

PHPで占いプログラムを作ろう」の第5回です。 月と日から星座を算出して、各星座に対応した鑑定文とイラスト画像を表示します。 今回で、占いプログラムを完成させます。
※最終完成形はこちら→占いプログラムサンプル

前回は、ユーザーが入力した生年月日のデータを受け取って、入力された年月日が存在するかどうか妥当性をチェックをしました。 今回は、ユーザーの入力した年月日が妥当な場合には、月と日から星座を算出して、各星座に対応した鑑定文とイラスト画像を表示します。

result.phpを開いて、下記のように書き換えてください。

サンプルソース:result.php
<?php //変数の受け取り extract($_GET); ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>ねこ占い鑑定結果|生年月日を元にした占いプログラム</title> </head> <body> <h1>ねこ占い</h1> <?php /******************************* 未入力チェック *******************************/ $errmsg = ''; //エラーメッセージを空にしておく if ($y == '') { $errmsg = $errmsg.'<p>生まれた年が入力されていません。</p>'; } if ($m == '') { $errmsg = $errmsg.'<p>生まれた月が入力されていません。</p>'; } if ($d == '') { $errmsg = $errmsg.'<p>生まれた日が入力されていません。</p>'; } /******************************* 年月日の妥当性チェック *******************************/ if ($errmsg == '') { if (!checkdate($m, $d, $y)) { $errmsg = $errmsg.'<p>入力された年月日は存在していません。</p>'; } } /******************************* 鑑定結果の表示 *******************************/ if ($errmsg != '') { //エラーメッセージが空ではない場合には、エラーメッセージを表示する echo $errmsg; echo '<p><a href="javascript:history.back();">前のページへ戻る</a></p>'; } else { echo '<p>'.$y.'年'.$m.'月'.$d.'日生まれ</p>'; /******************************* 星座の算出 *******************************/ //ユーザーの入力した内容を日付に変換 $birthday = date($y."/".$m."/".$d); if ((strtotime($birthday) >= strtotime($y.'/3/21')) && (strtotime($birthday) <= strtotime($y.'/4/19'))) { $result = 1; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>自分で考えて道を切り拓く自立した行動派</p>'; //おひつじ座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/4/20')) && (strtotime($birthday) <= strtotime($y.'/5/20'))) { $result = 2; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>のんびりゆったり忍耐強い穏健派</p>'; //おうし座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/5/21')) && (strtotime($birthday) <= strtotime($y.'/6/21'))) { $result = 3; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>知的好奇心旺盛で会話上手な人気者</p>'; //ふたご座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/6/22')) && (strtotime($birthday) <= strtotime($y.'/7/22'))) { $result = 4; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>愛情深く感性豊かなロマンチスト</p>'; //かに座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/7/23')) && (strtotime($birthday) <= strtotime($y.'/8/22'))) { $result = 5; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>名誉を守り努力を重ね王道をいく理想家</p>'; //しし座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/8/23')) && (strtotime($birthday) <= strtotime($y.'/9/22'))) { $result = 6; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>鋭い観察力と高い実務能力を持つ知性派</p>'; //おとめ座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/9/23')) && (strtotime($birthday) <= strtotime($y.'/10/23'))) { $result = 7; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>説得力あり自然に仲間が集まる平和主義者</p>'; //てんびん座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/10/24')) && (strtotime($birthday) <= strtotime($y.'/11/21'))) { $result = 8; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>控え目な態度の内側に闘志を秘めた情熱家</p>'; //さそり座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/11/22')) && (strtotime($birthday) <= strtotime($y.'/12/21'))) { $result = 9; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>即決即断まよわないこだわらない前向きな楽天家</p>'; //いて座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/12/22')) && (strtotime($birthday) <= strtotime($y.'/12/31'))) { $result = 10; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>リスクを慎重に避け責務を果たす堅実派</p>'; //やぎ座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/1/1')) && (strtotime($birthday) <= strtotime($y.'/1/19'))) { $result = 10; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>リスクを慎重に避け責務を果たす堅実派</p>'; //やぎ座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/1/20')) && (strtotime($birthday) <= strtotime($y.'/2/18'))) { $result = 11; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>目標のための努力と挑戦を厭わない野心家</p>'; //みずがめ座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/2/19')) && (strtotime($birthday) <= strtotime($y.'/3/20'))) { $result = 12; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>頼まれたら自己犠牲の精神で応える人情家</p>'; //うお座の性格 } else { $result = 0; echo '<p>判定でエラーが発生しました。</p>'; exit; } echo '<a href="./">もう一度、ねこ占う</a>'; } ?> </body> </html>

書き換えが完了したら、result.phpを上書き保存します。

ブラウザで表示確認してみよう

いま上書き保存したresult.phpをブラウザで表示確認してみましょう。

XAMPPによる動作確認手順
  1. XAMPPのコントロールパネルを立ち上げて、コントロールパネルの中のApacheをStartさせます。
  2. ブラウザを立ち上げてアドレス欄に http://localhost/sample/fortune/ と入力します。
  3. XAMPPのコントロールパネルやブラウザを立ち上げたままの状態なら、ブラウザの[更新]ボタンを押すだけで表示が切り替わります。

下記のように、ユーザーが生年月日を入力して[生年月日で占う!]ボタンを押すと、次の画面で鑑定結果を表示するようになれば成功です。



この占いプログラムはこれで完成です。 今回書き足したソースを確認していきましょう。

ユーザーの入力した内容を日付に変換する

PHPソースをいくつかの部分に分けて、順番に確認していきましょう。

ユーザーの入力した内容は、$y・$m・$dという変数に対してそれぞれ数値が代入されている状態になっています。 これ以降の星座算出の部分では日付の比較を行いたいので、この数値を日付に変換してやる必要があります。

サンプルソース:result.phpの抜粋
/******************************* 星座の算出 *******************************/ //ユーザーの入力した内容を日付に変換 $birthday = date($y."/".$m."/".$d);

上記のPHPソースではdate()という関数を使用して、ユーザーの入力した内容を日付に変換しています。 date($y."/".$m."/".$d)で作成した日付値を、変数$birthdayに代入しています。

ユーザーの入力した年月日から星座を算出する

変数$birthdayにユーザーの入力した年月日を代入したら、その年月日から星座を算出します。

サンプルソース:result.phpの抜粋
/******************************* 星座の算出 *******************************/ //ユーザーの入力した内容を日付に変換 $birthday = date($y."/".$m."/".$d); if ((strtotime($birthday) >= strtotime($y.'/3/21')) && (strtotime($birthday) <= strtotime($y.'/4/19'))) { $result = 1; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>自分で考えて道を切り拓く自立した行動派</p>'; //おひつじ座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/4/20')) && (strtotime($birthday) <= strtotime($y.'/5/20'))) { $result = 2; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>のんびりゆったり忍耐強い穏健派</p>'; //おうし座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/5/21')) && (strtotime($birthday) <= strtotime($y.'/6/21'))) { $result = 3; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>知的好奇心旺盛で会話上手な人気者</p>'; //ふたご座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/6/22')) && (strtotime($birthday) <= strtotime($y.'/7/22'))) { $result = 4; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>愛情深く感性豊かなロマンチスト</p>'; //かに座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/7/23')) && (strtotime($birthday) <= strtotime($y.'/8/22'))) { $result = 5; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>名誉を守り努力を重ね王道をいく理想家</p>'; //しし座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/8/23')) && (strtotime($birthday) <= strtotime($y.'/9/22'))) { $result = 6; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>鋭い観察力と高い実務能力を持つ知性派</p>'; //おとめ座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/9/23')) && (strtotime($birthday) <= strtotime($y.'/10/23'))) { $result = 7; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>説得力あり自然に仲間が集まる平和主義者</p>'; //てんびん座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/10/24')) && (strtotime($birthday) <= strtotime($y.'/11/21'))) { $result = 8; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>控え目な態度の内側に闘志を秘めた情熱家</p>'; //さそり座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/11/22')) && (strtotime($birthday) <= strtotime($y.'/12/21'))) { $result = 9; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>即決即断まよわないこだわらない前向きな楽天家</p>'; //いて座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/12/22')) && (strtotime($birthday) <= strtotime($y.'/12/31'))) { $result = 10; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>リスクを慎重に避け責務を果たす堅実派</p>'; //やぎ座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/1/1')) && (strtotime($birthday) <= strtotime($y.'/1/19'))) { $result = 10; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>リスクを慎重に避け責務を果たす堅実派</p>'; //やぎ座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/1/20')) && (strtotime($birthday) <= strtotime($y.'/2/18'))) { $result = 11; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>目標のための努力と挑戦を厭わない野心家</p>'; //みずがめ座の性格 } else if ((strtotime($birthday) >= strtotime($y.'/2/19')) && (strtotime($birthday) <= strtotime($y.'/3/20'))) { $result = 12; echo '<p><img src="./images/result'.$result.'.png"></p>'; echo '<p>頼まれたら自己犠牲の精神で応える人情家</p>'; //うお座の性格 } else { $result = 0; echo '<p>判定でエラーが発生しました。</p>'; exit; } echo '<a href="./">もう一度、ねこ占う</a>';

いま作成しているねこ占いは、十二星座占いがペースになっています。 プログラムの裏側ではユーザーの入力した誕生日をもとに、その人の星座を算出しています。 星座を算出する際には、以下の条件でいずれかの星座にユーザーを振り分けています。

if ((strtotime($birthday) >= strtotime($y.'/3/21')) && (strtotime($birthday) <= strtotime($y.'/4/19'))) {} の部分は、 「変数$birthdayが3/21より大きい、かつ、変数$birthdayが4/19より小さい」という条件を満たすかどうかを判定しています。 つまり、3/21 ~ 4/19生まれかどうかを判定しており、この条件に当てはまればおひつじ座と判断します。

日付比較の際には、strtotime()関数を掛けた値同士を比較しています。 strtotime()関数を掛けると、 英文形式の日付がUNIXタイムスタンプに変換されます。 比較する双方の値の形式をUNIXタイムスタンプに揃えることで、イレギュラーな誤判定が起きないように配慮しています。

年をまたぐケースへの配慮

12/22 ~ 1/19生まれの場合はやぎ座と判定します。

年をまたぐので条件を二つに分けて処理しています。 つまり、 12/22 ~ 12/31生まれの場合はやぎ座という条件と、 1/1 ~ 1/19生まれの場合はやぎ座という条件を、二つに分けて処理したということです。

これで占いプログラムは完成、さらにアレンジしても面白い

これで、占いプログラムは完成です。

鑑定結果では、振り分けられた十二星座を元に鑑定文とねこ画像を表示していますが、裏側はシンプルな星座占いです。 十二星座を算出するだけなら、生まれ年を入力してもらう必要は無いのですが、 占い結果をさらにアレンジする可能性を考慮して、ユーザーに生まれ年を選択してもらう仕様にしました。

占い結果をさらにアレンジするアイデアとしては、 例えば、年齢を算出することで20代のやぎ座は○○、30代のやぎ座は●●という具合に ユーザーの年齢に応じて占い結果を分岐させても良いでしょう。

また、性別を選択してもらう仕様にすれば、性別に応じて鑑定結果を変化させることも可能です。 相性占いに挑戦してみるのも良いでしょう。