PHPstep

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

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

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

PHPで占いプログラムを作ろう」の第3回です。 今回で、生年月日入力ページ(index.php)を完成させます。
※最終完成形はこちら→占いプログラムサンプル

年の入力部分をループ処理にする

前回は、生まれた月や生まれた日の入力欄を、PHPのfor文を使ったループ処理にしました。 生まれた年についても同様に、for文を使ったループ処理にしていきましょう。

index.phpを開いて、生まれた年の入力部分を下記のように書き換えてください。

サンプルソース:index.php
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>ねこ占い|生年月日を元にした占いプログラム</title> </head> <body> <h1>ねこ占い</h1> <p>※生年月日で占います</p> <form method="get" action="result.php"> <p> 生年月日:<br> <?php /******************************* 生年月日(年) *******************************/ //現在の西暦年を取得 $date = getdate(); $nowyear = $date["year"]; $startyear = $nowyear-100; echo '<label>'; echo '<select name="y">'; echo '<option value="">----</option>'; for($i=0; $i<=100; $i++) { $optionyear = $startyear + $i; echo '<option value="'.$optionyear.'">'.$optionyear.'</option>'; } echo '</select>年 '; echo '</label>'; /******************************* 生年月日(月) *******************************/ echo '<label>'; echo '<select name="m">'; echo '<option value="">--</option>'; for($i=1; $i<=12; $i++) { echo '<option value="'.$i.'">'.$i.'</option>'; } echo '</select>月 '; echo '</label>'; /******************************* 生年月日(日) *******************************/ echo '<label>'; echo '<select name="d">'; echo '<option value="">--</option>'; for($i=1; $i<=31; $i++) { echo '<option value="'.$i.'">'.$i.'</option>'; } echo '</select>日'; echo '</label>'; echo '</p>'; echo '<p><input type="submit" value="生年月日で占う!"></p>'; echo '</form>'; ?> </body> </html>

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

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

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

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

下記のように、生まれた年が現在の西暦年からさかのぼって、過去100年分選択できるようになれば成功です。

現在の西暦年を取得する

いま書き換えた生まれた年の入力欄部分のPHPソースに注目してみましょう。

サンプルソース:index.phpの抜粋
/******************************* 生年月日(年) *******************************/ //現在の西暦年を取得 $date = getdate(); $nowyear = $date["year"]; $startyear = $nowyear-100; echo '<label>'; echo '<select name="y">'; echo '<option value="">----</option>'; for($i=0; $i<=100; $i++) { $optionyear = $startyear + $i; echo '<option value="'.$optionyear.'">'.$optionyear.'</option>'; } echo '</select>年 '; echo '</label>';

上記のPHPソースでは、まず現在の西暦年を取得しています。 注目してほしいのは、 $date = getdate(); の部分です。 getdate()関数は、現在の年月日時を取得する際に使用します。 getdate()関数を使用すると連想配列の形式で値が返ります。 その値を$dateという変数に代入しているのです。

連想配列とは、格納されているデータをキーワードで指定して取得できる配列のことです。 普通の配列では格納されている順番(自然数)でデータを指定して取得しますが、 連想配列では数値以外のキー(テキスト)でデータを指定して取得することができます。

例えば、getdate()関数から年や月などの値を個別に取り出すには、年や月それぞれに決められている連想配列のキーを指定します。 年を取得する場合のキーは"year"です。

$nowyear = $date["year"]; の部分では、連想配列の値が代入されている変数$dateに"year"というキーを指定して、現在の西暦年を取得しています。 そして、変数$nowyearに取得した現在の西暦年を代入しています。

連想配列のキーと返り値の関係は、以下のようにまとめることができます。

キー説明戻り値の例
"seconds"0 ~ 59
"minutes"0 ~ 59
"hours"0 ~ 23
"mday"月単位の日1 ~ 31
"wday"曜日0 (日曜) ~ 6 (土曜)
"mon"1 ~ 12
"year"2016
"yday"年単位の日0 ~ 365
"weekday"曜日Sunday ~ Saturday
"month"January ~ December
0UNIX時(1970年1月1日)からの秒数システムにより異なるが、
通常は -2147483648 ~ 2147483647

今回の作成例では、現在の西暦年が必要だったので $date["year"] と指定しましたが、 例えば、現在月を取得するなら $date["mon"]、現在日を取得するなら $date["mday"] と指定することになります。

100年前から現在年までの入力欄を作成する

生まれた年の入力部分をループ処理にする部分では、 月や日をループ処理にした場合と同じようにfor文が使われています。

サンプルソース:index.phpの抜粋
/******************************* 生年月日(年) *******************************/ //現在の西暦年を取得 $date = getdate(); $nowyear = $date["year"]; $startyear = $nowyear-100; echo '<label>'; echo '<select name="y">'; echo '<option value="">----</option>'; for($i=0; $i<=100; $i++) { $optionyear = $startyear + $i; echo '<option value="'.$optionyear.'">'.$optionyear.'</option>'; } echo '</select>年 '; echo '</label>';

上記のPHPソースでは、 for($i=0; $i<=100; $i++) { ~ } の部分でfor文が使用されています。 これは「カウンタを1から開始して、100になるまでループを続けなさい、カウンタは1ずつ増えるものとする」 と指定していることになります。 ループ内の処理の部分では、選択肢となるHTMLの<option>タグが100回吐き出されることになります。

月や日の入力部分を作成した時と若干異なるのは、ループで吐き出す最初の西暦年を現在の100年前にしている点です。 そして、100回ループして最後に吐き出されるのが現在の西暦年となるようにしています。 まず、$startyear = $nowyear-100;の部分で現在年から100を引いておきます。 その後、forループのなかで$startyearに対して1を100回足していくことで最終的に現在年に戻るというわけです。

生まれた年の選択肢を100年分にしたのは、 人の寿命をおよそ100年くらいと仮定して「100歳以下の人なら生まれ年が選択できるように」という狙いからです。