[PHP]カレンダーを利用した予約システムの作り方[初心者向け]
みなさんこんにちは!ワトスンです。
今回は、、
といった疑問に答えます。
■読んでほしい人
PHPでカレンダーの作成方法/祝日の追加方法を理解できている方
「カレンダーの作成方法」「祝日の追加方法」の理解がまだの方は下↓の記事を参考にして下さい。
*カレンダーが完成している前提で解説していきます。
PHP言語でデータベースから情報を取り出しそれをカレンダーに表示させるにはどうしたらいいか、わかりやすく解説していくので初心者の方もぜひ参考にしてみて下さい。
それでは解説していきます。
目次
PHPで予約システムを作る手順
予約システムの作成手順は以下の通りです。
1:予約フォームの作成
2:データベースへの書き込み
3:データベースからの取り出し
4:カレンダーへの表示
予約フォームから情報を登録→その情報をデータベースに取り込み→データベースから情報を取り出す→カレンダーに情報を書き込む
といった感じです。
今回は4つ目の「カレンダーへの表示」を中心に解説していきます。
他の3つも簡単に解説していきます。
ちなみに今回は、「カレンダーに予約人数を表示させる予約システム」を作成していきます。
予約フォームの作成
予約システムには「予約フォーム」が必須です。
「予約フォーム」から名前や電話番号、日時などの情報をユーザーに登録してもらいます。
簡単に作ってみたのが下の画像のような感じです。
このように予約に必要な項目を用意しておきます。
「予約フォーム」の作り方を簡単にご紹介します。
「予約フォーム」はHTML言語を使用して作成していきます。
コードは以下のような感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<form action="reservation_calender.php" method="post"> お名前 <div><input type="text" name="name" placeholder="山田太郎"></div> 電話番号 <div><input type="tel" name="number" placeholder="08012349876"></div> 人数 <div><input name="member"></div> 日付 <div> <input type="date" name="day" list="daylist" min=""> </div> <div class="submit"> <input type="submit" value="送信"> </div> <div class="reset"> <input type="reset" value="リセット"> </div> </form> |
今回の場合は”reservation_calender.php”へactionさせています。
“reservation_calender.php”で「データベースへの書き込み」ができるようにしていきいます。
データベースへの書き込み
次は、「予約フォーム」から登録された情報をデータベースへ書き込んでいきます。
*データベースへ書き込むにはテーブルを用意しておく必要があります。
今回は下の画像のようなテーブルをご用意しました。
データベースへ書き込むために必要な情報は以下の通りです。
・ホスト名
・データベース名
・テーブル名
・文字コードの種類(ほとんどの場合charset=utf8でOK)
・ユーザー名
・パスワード(特に指定していない場合は空白でOK)
それぞれの項目の確認方法は「特権」から確認できます。
データベースへ書き込むためのプログラムは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?php if(isset($_POST['name'])) { //名前が送信されたら以下の処理を行う //この部分は変更してもいい //「予約フォーム」からの情報をそれぞれ変数に格納しておく↓ $name=htmlspecialchars($_POST["name"], ENT_QUOTES); $number=htmlspecialchars($_POST["number"], ENT_QUOTES); $member=htmlspecialchars($_POST["member"], ENT_QUOTES); $day=htmlspecialchars($_POST["day"], ENT_QUOTES); //「予約フォーム」からの情報をそれぞれ変数に格納しておく↑ $dsn="mysql:host=ホスト名;dbname=データベース名;charset=utf8"; $user="ユーザー名"; $pass="パスワード"; try{ $db = new PDO($dsn,$user,$pass); $db->query("INSERT INTO テーブル名 (ban,name,number,member,day) VALUES (NULL,'$name','$number','$member','$day')"); }catch (Exception $e) { echo $e->getMessage() . PHP_EOL; } header("Location: reservation_form.php"); //"reservation_form.php(予約フォームがあったページ)"に戻る exit; } ?> |
「データベースへの書き込み」ができれば次は、「データベースからの情報取り出し」をしていきます。
データベースからの取り出し
ちなみに今回は「予約フォーム」で”日付”と”人数”を登録してもらっているので、その情報をもとにカレンダーに人数を表示させるシステムを作成していきます。
早速ですが以下のプログラムをみて下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
function getreservation(){ $dsn="mysql:host=ホスト名;dbname=データベース名;charset=utf8"; $user="ユーザー名"; $pass="パスワード"; $db = new PDO($dsn,$user,$pass); $ps = $db->query("SELECT * FROM テーブル名"); $reservation_member = array(); foreach($ps as $out){ $day_out = strtotime((string) $out['day']); $member_out = (string) $out['member']; $reservation_member[date('Y-m-d', $day_out)] = $member_out; } ksort($reservation_member); return $reservation_member; } |
getreservation関数を作ってみました。
この関数は、「予約された日の予約人数を取得する」関数です。
上のプログラムを詳しくみていきましょう。
予約情報一覧を$psへ格納
まずはこの↓部分。
1 2 3 4 5 |
$dsn="mysql:host=ホスト名;dbname=データベース名;charset=utf8"; $user="ユーザー名"; $pass="パスワード"; $db = new PDO($dsn,$user,$pass); $ps = $db->query("SELECT * FROM テーブル名"); |
この部分は「予約フォーム」から登録された全ての情報を取り出して$psに格納しただけです。
指定のテーブルから登録情報一覧を取得しています。
予約日とその日の予約人数を$reservation_memberへ格納
次はこの↓部分をみて下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$reservation_member = array(); //各日付の予約人数を$reservation_memberへ入れるため配列を用意しておく foreach($ps as $out){ //登録された予約情報を全て$outに格納 $day_out = strtotime((string) $out['day']); //予約された全ての日付情報を文字列として$day_outへ格納 //例:echo $day_out; → 2021-01-23 $member_out = (string) $out['member']; //予約された全ての日のそれぞれの人数を文字列として$member_outへ格納 //例:echo $member_out; → 3 $reservation_member[date('Y-m-d', $day_out)] = $member_out; //$day_outで取得した日付をもとにそれぞれの予約人数を$reservation_memberへ格納 //例:echo $reservation_member; → [2021-01-23]=>3 } |
これは、$reservation_memberへ「予約日とその日の予約人数」を格納しています。
日付の古い順に並び替えてから返す
最後にこの↓部分。
1 2 3 4 |
ksort($reservation_member); //日付とその人数の情報を古い日付順に並び替える return $reservation_member; //古い日付順に並んでいる人数情報を返す |
ここで、日付の古い順に並び替えて$reservation_memberの情報を整理して返しています。
以上が「getreservation関数」の内容です。
作成した「getreservation関数」を使用してカレンダーへ予約人数を表示していきます。
カレンダーへの表示
さて、ここからが今回の本題です。
「カレンダーの日付と予約された日付を照合する関数」を作成していきます。
「予約人数を表示させる関数」を作成する
以下のプログラムがその関数(reservation関数)の作り方です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
$reservation_array = getreservation(); //getreservation関数を$reservation_arrayに代入しておく function reservation($date,$reservation_array){ //カレンダーの日付と予約された日付を照合する関数 if(array_key_exists($date,$reservation_array)){ //もし"カレンダーの日付"と"予約された日"が一致すれば以下を実行する if($reservation_array[$date] >= 10){ //予約人数が10人以上の場合は以下を実行する $reservation_member = "<br/>"."<span class='green'>"."予約できません"."</span>"; return $reservation_member; } else{ //予約人数が10人より少なければ以下を実行する $reservation_member = "<br/>"."<span class='green'>".$reservation_array[$date]."人"."</span>"; //例:echo $reservation_member; → 3人 //色を変えるためにspanでclassをつけた return $reservation_member; } } } |
今回は、
予約人数が10人以上の場合→カレンダーに”予約できません”と表示
予約人数が10人より少ない場合→その日の予約人数を表示
するような関数にしました。
そして完成した「reservation関数」を使用して、カレンダーに予約人数を表示していきます。
カレンダーに関数を反映させる
最後の工程です。
先ほど作成した「reservation関数」を使用してカレンダーに予約人数を表示させます。
プログラムは以下↓の通りです。*ちょっと長いです
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 |
<!-----------カレンダープログラム---------------> <?php //タイムゾーンを設定 date_default_timezone_set('Asia/Tokyo'); //前月・次月リンクが選択された場合は、GETパラメーターから年月を取得 if(isset($_GET['ym'])){ $ym = $_GET['ym']; }else{ //今月の年月を表示 $ym = date('Y-m'); } //タイムスタンプ(どの時刻を基準にするか)を作成し、フォーマットをチェックする //strtotime('Y-m-01') $timestamp = strtotime($ym . '-01'); if($timestamp === false){//エラー対策として形式チェックを追加 //falseが返ってきた時は、現在の年月・タイムスタンプを取得 $ym = date('Y-m'); $timestamp = strtotime($ym . '-01'); } //今月の日付 フォーマット 例)2020-10-2 $today = date('Y-m-j'); //カレンダーのタイトルを作成 例)2020年10月 $html_title = date('Y年n月', $timestamp);//date(表示する内容,基準) //前月・次月の年月を取得 //strtotime(,基準) $prev = date('Y-m', strtotime('-1 month', $timestamp)); $next = date('Y-m', strtotime('+1 month', $timestamp)); //該当月の日数を取得 $day_count = date('t', $timestamp); //1日が何曜日か $youbi = date('w', $timestamp); //カレンダー作成の準備 $weeks = []; $week = ''; //第1週目:空のセルを追加 //str_repeat(文字列, 反復回数) $week .= str_repeat('<td></td>', $youbi); for($day = 1; $day <= $day_count; $day++, $youbi++){ $date = $ym . '-' . $day; //それぞれの日付をY-m-d形式で表示例:2020-01-23 //$dayはfor関数のおかげで1日づつ増えていく $Holidays_day = display_to_Holidays(date("Y-m-d",strtotime($date)),$Holidays_array); //display_to_Holidays($date,$Holidays_array)の$dateに1/1~12/31の日付を入れる //比較してあったらdisplay_to_Holidaysメソッドによって$Holidays_array[$date]つまり$holidaysがreturnされる $reservation = reservation(date("Y-m-d",strtotime($date)),$reservation_array); if($today == $date){ //もしその日が今日なら $week .= '<td class="today">' . $day;//今日の場合はclassにtodayをつける }elseif(display_to_Holidays(date("Y-m-d",strtotime($date)),$Holidays_array)){ //もしその日に祝日が存在していたら //その日が祝日の場合は祝日名を追加しclassにholidayを追加する $week .= '<td class="holiday">' . $day . $Holidays_day; }elseif(reservation(date("Y-m-d",strtotime($date)),$reservation_array)){ $week .= '<td>' . $day . $reservation; }else{ //上2つ以外なら $week .= '<td>' . $day; } $week .= '</td>'; if($youbi % 7 == 6 || $day == $day_count){//週終わり、月終わりの場合 //%は余りを求める、||はまたは //土曜日を取得 if($day == $day_count){//月の最終日、空セルを追加 $week .= str_repeat('<td></td>', 6 - ($youbi % 7)); } $weeks[] = '<tr>' . $week . '</tr>'; //weeks配列にtrと$weekを追加 $week = '';//weekをリセット } } ?> <!-----------カレンダープログラム---------------> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>PHPカレンダー</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <link href="https://fonts.googleapis.com/css?family=Noto+Sans" rel="stylesheet"> <style> .container { font-family: 'Noto Sans', sans-serif; margin-top: 80px; } h3 { margin-bottom: 30px; } th { height: 30px; text-align: center; } td { height: 100px; } .today { background: orange; } th:nth-of-type(1), td:nth-of-type(1) { color: red; } th:nth-of-type(7), td:nth-of-type(7) { color: blue; } .holiday{ color: red; } .green{ color: green; } </style> </head> <body id=""> <div class="container"> <h3><a href="?ym=<?php echo $prev; ?>"><</a><?php echo $html_title; ?><a href="?ym=<?php echo $next; ?>">></a></h3> <table class="table table-bordered"> <tr> <th>日</th> <th>月</th> <th>火</th> <th>水</th> <th>木</th> <th>金</th> <th>土</th> </tr> <?php foreach ($weeks as $week) { echo $week; } ?> </table> </div> </body> </html> |
長くなりましたが、こんな感じでカレンダーに予約人数を表示します。
それぞれわかりにくい箇所はコメントしてあるので理解できると思いますが、どうしてもわからない場合は検索してみて下さい。
自分でわからない箇所を検索して解決する力は、これからプログラミングをしていく上でとても大切です。
調べてもわからない点がありましたらコメントまたはTwitterのDMでご連絡ください!
以上です。
4 件の投稿
初めまして
ブログを参考にカレンダーを作成しております。
予約機能を追加したいのですが、躓いて前に進みません。
差し支えなければ、githubまたフォルダ構成が分かる物があれば教えて頂けないでしょうか?
よろしくお願い申し上げます。
初めまして。お返事が遅くなり大変申し訳ありません。
記事をご覧いただきありがとうございます。
ご相談頂いた件ですが、必要なファイルは
・予約フォーム
・フォームから入力された内容をデータベースで処理させるファイル(記事中のreservation_calender.phpです)
の以上2つになります。
記事中ではプログラムがバラバラですが、予約フォーム以外のプログラムはすべてreservation_calender.phpへ入れてください。
またご意見をもとに記事の改善をさせて頂きます。貴重なご意見ありがとうございました。
PHPの使用方法がわかりません
PHPはHTMLのようにメモ帳等ではコード入力できないんでしょうか
基本的な質問で申し訳ありません
初めまして。コメントありがとうございます。
お返事が遅くなったのでもう解決されてるかもしれませんが、PHPでもメモ帳などで作成可能ですが、やはりエディタ(私はBracketsを使用)の方が使いやすいかなと思います。
最終的にはサーバーなどにファイルをアップするので、メモ帳などでも問題はありません。