PHPメールフォームでの日付チェック方法

このQ&Aのポイント
  • メールフォームで生年月日を入力し、確認画面で日付チェックを行い、間違っている場合はフォーム画面に戻る方法について質問しています。
  • 現在の日付チェックの方法では、2月31日のような存在しない日付でも通過してしまう問題があります。
  • 閏年の計算も行えるような日付チェックの方法についても教えてほしいとの要望があります。
回答を見る
  • ベストアンサー

php メールフォーム日付チェック方法

現在メールフォームで生年月日を記述しており、生年月日の値を確認画面に渡し、確認画面にて日付チェックをして、日付が間違っていたらフォーム画面に戻るということをやりたいのですが、日付チェックの部分で困っています。 例→2月20日は○  →2月30日は× form.php <?php //年の入力 print '<select name="year">' . "\n"; $start = date('Y') -29; $end = date('Y') -16; for ($i = $start; $i <= $end; $i++) { print '<option value="' . sprintf("%04d",$i) . '">' . sprintf("%04d",$i) . '</option>' . "\n"; } print '</select>年' . "\n"; //月の入力 print '<select name="month">' . "\n"; for ($i = 01; $i <= 12; $i++) { print '<option value="' . sprintf("%02d",$i) . '">' . sprintf("%02d",$i) . '</option>' . "\n"; } print '</select>月' . "\n"; //日の入力 print '<select name="day">' . "\n"; for ($i = 01; $i <= 31; $i++) { print '<option value="' . sprintf("%02d",$i) . '">' . sprintf("%02d",$i) . '</option>' . "\n"; } print '</select>日' . "\n"; ?> confirm.php //生年月日をチェック if (checkdate($month, $day, $year)) { $error[] = '生年月日が正しくありません。'; } という記述です。 この記述方法ですと、 2月20日は「生年月日が正しくありません。」とでてきますが、 2月31日を指定すると確認画面を通過できるという謎の状態になっています。 できれば閏年の計算もできる方法もお願いします。 どうかご教授お願いします。

  • h-h13
  • お礼率24% (37/149)
  • PHP
  • 回答数2
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • hyoro
  • ベストアンサー率71% (5/7)
回答No.1

checkdate関数の返り値は「指定した日付が有効な場合に TRUE、そうでない場合に FALSE を返します。」となります。 なので、下のようなif文にする必要があります。 if (checkdate($month, $day, $year) === false) { $error[] = '生年月日が正しくありません。'; } また、checkdate関数は閏年の判断も行ってくれます。 詳しくはマニュアルを参照してください。

参考URL:
http://jp.php.net/manual/ja/function.checkdate.php
h-h13
質問者

補足

お忙しい中有難うございます。 PHPが初心者のもので・・・ もう一つお聞きしたいことがありまして、 本日より以前に選択された場合エラーをだす場合はどうしたらよろしいでしょうか? 例→2010年01月01日は○  →2009年01月01日は× <?php //年の入力 print '<select name="year">' . "\n"; $start = date('Y') 0; $end = date('Y') +1; for ($i = $start; $i <= $end; $i++) { print '<option value="' . sprintf("%04d",$i) . '">' . sprintf("%04d",$i) . '</option>' . "\n"; } print '</select>年' . "\n"; //月の入力 print '<select name="month">' . "\n"; for ($i = 01; $i <= 12; $i++) { print '<option value="' . sprintf("%02d",$i) . '">' . sprintf("%02d",$i) . '</option>' . "\n"; } print '</select>月' . "\n"; //日の入力 print '<select name="day">' . "\n"; for ($i = 01; $i <= 31; $i++) { print '<option value="' . sprintf("%02d",$i) . '">' . sprintf("%02d",$i) . '</option>' . "\n"; } print '</select>日' . "\n"; ?> 参考サイトを拝見させていただいたのですが、よくわからずでした。 質問ばかりで申し訳ありませんがよろしくお願いします。

その他の回答 (1)

  • hyoro
  • ベストアンサー率71% (5/7)
回答No.2

指定された日付が今日より前かと判断すれば良いのだと思いますが。

h-h13
質問者

補足

大変お手数をお掛けいたしますが、よろしければソースを教えていただけないでしょう?

関連するQ&A

  • phpプルダウンメニュー 日付チェック方法

    <?php //年の入力 print '<select name="year">' . "\n"; $start = date('Y') -0; $end = date('Y') +1; for ($i = $start; $i <= $end; $i++) { print '<option value="' . sprintf("%04d",$i) . '">' . sprintf("%04d",$i) . '</option>' . "\n"; } print '</select>年' . "\n"; //月の入力 print '<select name="month">' . "\n"; for ($i = 01; $i <= 12; $i++) { print '<option value="' . sprintf("%02d",$i) . '">' . sprintf("%02d",$i) . '</option>' . "\n"; } print '</select>月' . "\n"; //日の入力 print '<select name="day">' . "\n"; for ($i = 01; $i <= 31; $i++) { print '<option value="' . sprintf("%02d",$i) . '">' . sprintf("%02d",$i) . '</option>' . "\n"; } print '</select>日' . "\n"; ?> と記述して、日付選択のときに 本日より前の日を選んだら、エラー 本日より先の日を選んだら、OK 例→2009年01月01日は×  →2010年01月01日は○ というチェック方法をしたいのですが、どのように記述したらよろしいでしょうか? 宜しくお願いします。

    • ベストアンサー
    • PHP
  • php プルダウンメニュー

    メールフォームにて下記を作成しています。 <form action="confirm.php" method="post"> <select> <option>09:00</option> <option>09:30</option> <option>10:00</option> <option>10:30</option> </select> ~ <select> <option>11:00</option> <option>11:30</option> <option>12:00</option> <option>12:30</option> </select> </form> これを <?php //スタート時間の選択 print '<select name="start_time">' . "\n"; $start = date('Y') -0; $end = date('Y') +1; for ($i = $start; $i <= $end; $i++) { print '<option value="' . sprintf("%04d",$i) . '">' . sprintf("%04d",$i) . '</option>' . "\n"; } print '</select>~' . "\n"; //エンド時間の選択 print '<select name="end_time">' . "\n"; for ($i = 01; $i <= 31; $i++) { print '<option value="' . sprintf("%02d",$i) . '">' . sprintf("%02d",$i) . '</option>' . "\n"; } print '</select>' . "\n"; ?> の形のように記述できないでしょうか? 年月日の記述のためいろいろとおかしなとこがありますが、変更点等がございましたら、ご教授お願いします。

    • ベストアンサー
    • PHP
  • php メールフォーム プルダウンメニュー

    現在PHPにてメールフォームを作成しております。 フォーム→確認画面→送信という順に作成しています。 フォームの段階でプルダウンを作成していますが、確認画面でフォームの内容(プルダウンの項目)を表示させようとしたときに、そのまま表示されず、1年4月1日などと表示されます。 例→フォームでは1990年04月10日としたら確認画面では1年4月1日。 1990年04月10日のように表示させたい。 確認画面でどのように記述したらよろしいでしょうか? フォームの記述は <?php if (count($_POST) > 0) { $year = @$_POST['year']; $month = @$_POST['month']; $day = @$_POST['day']; } print '<select name="year">' . "\n"; $start = date('Y') -20; $end = date('Y') -10; for ($i = $start; $i <= $end; $i++) { print '<option value="' . $i . '">' . $i . '</option>' . "\n"; } print '</select>年' . "\n"; print '<select name="month">' . "\n"; for ($i = 1; $i <= 12; $i++) { print '<option value="' . $i . '">' . $i . '</option>' . "\n"; } print '</select>月' . "\n"; print '<select name="day">' . "\n"; for ($i = 1; $i <= 31; $i++) { print '<option value="' . $i . '">' . $i . '</option>' . "\n"; } print '</select>日' . "\n"; ?> です。 確認画面のスクリプトは $year = isset($_POST['year']) ? $_POST['year'][0] : NULL; $month = isset($_POST['month']) ? $_POST['month'][0] : NULL; $day = isset($_POST['day']) ? $_POST['day'][0] : NULL; と<?php print h($year[0]) ;?>年<?php print h($month[0]) ;?>月<?php print h($day[0]) ;?>日 です。 またセッションも使用しております。 $_SESSION['year'] = $year; $_SESSION['month'] = $month; $_SESSION['day'] = $day; です。 ご教授お願いします。

    • ベストアンサー
    • PHP
  • チェックボックス、セレクトメニューについて

    現在フォームを作成しております。 入力フォームで各項目を入力してから確認画面、送信となるフォームです。 入力フォームにて各項目を入力し、確認画面が表示され、確認画面にて入力等の間違えや、入力をし忘れた等などがあった場合「戻る」で、入力画面に戻るようにしています。 (必須項目が記入されていなかった場合は自動で入力画面に戻るように設定。) 入力画面にてセレクトメニュー(1990年01月01日に選択したとする。)、チェックボックス(MF,FWにチェックをしたとする。)を選択し、 確認画面が表示されたあと入力画面に戻るとセレクトメニューは選択した値(1990年01月01日)のはずが初期値の値(1980年01月01日)に戻っている。 チェックボックスは選択されていたはずなのにチェックがはずれているという現象が起きています。 入力画面→確認画面→入力画面ページが表示されてもセレクトメニューの値はそのままでなおかつチェックボックスの値もそのまま表示されているようにしたいです。 この現象を直すにはどのように記述したらよろしいでしょうか? 下記は入力フォームと確認画面の記述になります。 /***** 入力画面 *****/ <tr> <td class="title_back1"><label for="mail">生年月日</label></td> <td class="title_back2"> <p class="error"><?php print $_SESSION['err_birthday_ereg']; ?></p> <?php //年の入力 print '<select name="year">' . "\n"; $start = date('Y') -29; $end = date('Y') -16; for ($i = $start; $i <= $end; $i++) { print '<option value="' . sprintf("%04d",$i) . '">' . sprintf("%04d",$i) . '</option>' . "\n"; } print '</select>年' . "\n"; //月の入力 print '<select name="month">' . "\n"; for ($i = 01; $i <= 12; $i++) { print '<option value="' . sprintf("%02d",$i) . '">' . sprintf("%02d",$i) . '</option>' . "\n"; } print '</select>月' . "\n"; //日の入力 print '<select name="day">' . "\n"; for ($i = 01; $i <= 31; $i++) { print '<option value="' . sprintf("%02d",$i) . '">' . sprintf("%02d",$i) . '</option>' . "\n"; } print '</select>日' . "\n"; ?> </td> </tr> <tr> <td class="title_back4"><label for="position">希望ポジション</label></td> <td class="title_back5"> <input type='checkbox' name='position[]' value='GK'>GK <input type='checkbox' name='position[]' value='DF'>DF <input type='checkbox' name='position[]' value='MF'>MF <input type='checkbox' name='position[]' value='FW'>FW <input type='checkbox' name='position[]' value='MG'>MG </td> </tr> /***** 確認画面 ******/ $year = isset($_POST['year']) ? sprintf("%04d",$_POST['year']) : NULL; $month = isset($_POST['month']) ? sprintf("%02d",$_POST['month']) : NULL; $day = isset($_POST['day']) ? sprintf("%02d",$_POST['day']) : NULL; $position = isset($_POST['position']) ? implode(" , " , $_POST["position"]) : NULL; //生年月日をチェック if (checkdate($month, $day, $year) === false) { $_SESSION['err_birthday_ereg'] = '生年月日が正しくありません。'; $error = TRUE; } else { unset($_SESSION['err_birthday_ereg']); } <tr> <td class="title_back1">生年月日</td> <td class="title_back2"><?php print h($year) ;?>年&nbsp;<?php print h($month) ;?>月&nbsp;<?php print h($day) ;?>日</td> </tr> <tr> <td class="title_back4"><label for="career">希望ポジション</label></td> <td class="title_back5"><?php print h($position) ;?></td> </tr> と以上になります。 とても説明がしずらいためわかりにくいとこがあると思いますが、宜しくお願いします。 また、何か足りない記述等が御座いましたら、お申しでください。 他のテキストボックスなどは正常に動作しております。 (入力画面→確認画面→入力画面の動作をおこなってもテキストボックス内に表示されています。) 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP DBデータ登録

    お世話になります。 PHPからDBにレコード登録についてお聞きしたいことがあり、ご質問させていただきました。 初心者のためご教授いただければと思います。 サーバーはさくらインターネット PHPは5.2.12 データベースはMySQL 5.1 <?php ・ ・ ・ $link = mysql_connect($DB_HOST,$DB_USER,$DB_PASS; mysql_select_db($DB_NAME,$link); mysql_set_charset('sjis',$link); $id = addslashes($_POST['id']); $password = addslashes($_POST['password']); $first_name = addslashes($_POST['first_name']); $last_name = addslashes($_POST['last_name']); $year = addslashes($_POST['year']); $month = addslashes($_POST['month']); $day = addslashes($_POST['day']); $query_reg = sprintf("INSERT INTO member (id,password,first_name,last_name,first_kana,last_kana,year,month,day) VALUES('$id','$password','$first_name','$last_name','$first_kana','$last_kana','$year','$month','$day')"); $result_reg = mysql_query($query_reg, $link); ・ ・ ・ ?> <html> <body> <form action="completion.php" method="POST"> <input type="text" name="id"/><br> <input type="text" name="password" /> <input type="text" name="first_name"/> <input type="text" name="last_name"/> <input type="text" name="first_kana" /> <input type="text" name="last_kana" /> <?php //年の入力 print '<select name="year">' . "\n"; $start = date('Y') -29; $end = date('Y') -16; for ($i = $start; $i <= $end; $i++) { $selected = ""; $selected = ($_SESSION["year"] == sprintf("%04d",$i)) ? "selected":""; print '<option value="' . sprintf("%04d",$i) . '" '.$selected.'>' . sprintf("%04d",$i) . '</option>' . "\n"; } print '</select> 年' . "\n"; //月の入力 print '<select name="month">' . "\n"; for ($i = 01; $i <= 12; $i++) { $selected = ""; $selected = ($_SESSION["month"] == sprintf("%02d",$i)) ? "selected":""; print '<option value="' . sprintf("%02d",$i) . '" '.$selected.'>' . sprintf("%02d",$i) . '</option>' . "\n"; } print '</select> 月' . "\n"; //日の入力 print '<select name="day">' . "\n"; for ($i = 01; $i <= 31; $i++) { $selected = ""; $selected = ($_SESSION["day"] == sprintf("%02d",$i)) ? "selected":""; print '<option value="' . sprintf("%02d",$i) . '" '.$selected.'>' . sprintf("%02d",$i) . '</option>' . "\n"; } print '</select> 日' . "\n"; ?> <input type="submit" value="登録"> </form> と記述しています。 ですが、調べたコードを自分の環境に変更しながら記述したのですが、データベースでは真っ白の状態で登録されてしまいます。 (真っ白の状態というよりフォームで入力した内容が表示されない。) phpファイルはShift-JISで記述しています。 どなたかお分かりの方がいらっしゃいましたら、ご教授お願いいたします。

    • ベストアンサー
    • PHP
  • phpの値の受け渡し方法について

    b.phpの <dl> <form action='a.php' method='post'> <dt>生年月日</dt> <dd> <select name="Y"> <?php $start = 1920; //始まりの年 $end = 2020; //終わりの年 $select = 2000; //最初に選択された状態で表示したい年 for ($i=$start;$i<=$end;$i++){ if($i==$select){ echo "<option value=\"$i\" selected=\"selected\">$i</option>\n"; }else{ echo "<option value=\"$i\">$i</option>\n"; } } ?> </select> 年 <select name="M"> <?php for ($i=1;$i<=12;$i++){ echo "<option value=\"$i\">$i</option>\n"; } ?> </select> 月 <select name="D"> <?php for ($i=1;$i<=31;$i++){ echo "<option value=\"$i\">$i</option>\n"; } ?> </select> 日 </dd> </dl> <input type="submit" value="送信する" /> </form> というコードで取得した生年月日をa.phpに渡し、表示させます。 a.phpファイルで <?php print('誕生日は:' . ($_REQUEST['Y']. '年',ENT_QUOTES)); print(($_REQUEST['M']. '月',ENT_QUOTES)); print(($_REQUEST['D']. '日',ENT_QUOTES)); ?> と、コードを入力しましたら、 誕生日は:1985年1月31日 という値を受け取り、ブラウザ上で表示することはできたのですが、他のコードで表示する方法はないのかと考えております。 もし、他のコードで表示できる方法がありましたらぜひ教えてください。お願いします。

    • ベストアンサー
    • PHP
  • php プルダウンメニュー 時刻チェック

    <?php print '<select name="start_time">' . "\n"; $start = mktime(09,00); $end = mktime(19,00); for ($i = $start; $i <= $end; $i+=30*60) { $time=date("H:i",$i); print "<option value=\"{$time}\">{$time}</option>\n"; } print '</select>~' . "\n"; print '<select name="end_time">' . "\n"; $start = mktime(11,00); $end = mktime(21,00); for ($i = $start; $i <= $end; $i+=30*60) { $time=date("H:i",$i); print "<option value=\"{$time}\">{$time}</option>\n"; } print '</select>' . "\n"; ?> となっている場合選択される場合 14:00~16:00と選んでいただければよいのですが、この記述だと14:00~10:00と選ぶことが可能になってしまいます。 ここでご質問なのですが、start_timeのセレクトを選んだ場合、自動でend_timeをstart_timeで選んだ時刻の2時間後から選択できる記述はないでしょうか? javascriptを使わないといけないのでしょうか? もしphpでございましたらご教授お願いします。

    • 締切済み
    • PHP
  • 日付のセレクトボックスで0付きの日付にしたい

    ネットで探した式を張り付ける位しかできない超初心者です。 以下のような当日表示の日付のセレクトボックス を探してペーストしたのですが1や2を01、02と表示しません。 これをどうやって直せば01,02,03,04,05と0付きの表示のセレクトボックスに 直せるでしょうか? どうぞよろしくお願いいたします。 <? $time = time(); $year = date("Y", $time); $month = date("n", $time); $day = date("j", $time); print("<select name=\"ayear\">"); //年は修正してください for( $i = 2010; $i <= 2020; $i++ ){ if( $i == $year ){ print("<option value=\"$i\" selected>$i</option>"); }else{ print("<option value=\"$i\">$i</option>"); } } print("</select>年"); print("<select name=\"amonth\">"); for( $j = 1; $j <= 12; $j++ ){ if( $j == $month ){ print("<option value=\"$j\" selected>$j</option>"); }else{ print("<option value=\"$j\">$j</option>"); } } print("</select>月"); print("<select name=\"aday\">"); for( $k = 1; $k <=31 ; $k++ ){ if( $k == $day ){ print("<option value=\"$k\" selected>$k</option>"); }else{ print("<option value=\"$k\">$k</option>"); } } print("</select>日"); ?>

    • ベストアンサー
    • PHP
  • PHPで日付の範囲検索

    PHPを使って日付の範囲検索を実装しています。日付をセレクトフォームで選択し、該当する日時をSELECT文で記述するという流れです。イメージは以下のような感じですが、大体合っていますか? <? php if (!empty(filter_input(INPUT_POST, 'day'))) { $day = filter_input(INPUT_POST, 'day'); ・・・・ SELECT 文   ・・・・ ?> <html> <div class="search"> <form method="post"> <select name="year"> <?php for ($i=2000; $i <= 2021; $i++) { $year .= '<option value="'.$i.'">'.$i.'年</option>'; } ?> </select> <select name="month"> <?php for ($i=1; $i <= 12; $i++) { $month .= '<option value="'.$i.'">'.$i.'月</option>'; } ?> </select> <select name="day"> <?php for ($i=1; $i <= 31; $i++) { $day .= '<option value="'.$i.'">'.$i.'日</option>'; } ?> </select> <input type="hidden" name="search" value="<?php echo $_POST['year'].'-'. $_POST['month'].'-'. $_POST['date']; ?>"> <input type="submit" value="検索"> </form> </div> </html>

    • ベストアンサー
    • PHP
  • 日付プルダウン選択フォーム

    専門の方が退社されて、サブ業務で多少HPの情報更新や修正をしていた私にお鉢が回ってきてしまい困っており、お教えいただけるとありがたいです。 現在のフォームですと、2ヶ月先までフォームで選択来るようになっており、今なら今年の12月・来年の1月・来年の2月が選択可能になっているのですが これを4ヶ月先まで選択出来るようにしたい場合どのようにしたらいいのでしょうか? 月セレクト>11月より後の処理>optgroup label forあたりの記述がイマイチ理解出来てないです。 //西暦取得 $seireki = date("Y"); //来年を取得 $rainen = date("Y",strtotime("+1 year")); //今月を取得-0をつけない⇒付ける時は"m" $tsuki = date("n"); //翌月を取得 $yokutsuki = date('n', strtotime(date('Y-m-1').' +1 month')); //再来月を取得 $saraigetsu = date('n', strtotime(date('Y-m-1').' +2 month')); //今日を取得-0を付けない⇒着ける時は"d" $hi = date("j"); //指定した月の日数を取得 $tsukihi = date("t"); //翌月の日数を取得 $yokutsukihi = date("t",mktime(0, 0, 0, date("m")+1, 1, date("Y"))); //再来月の日数を取得 $saraigetsuhi = date("t",mktime(0, 0, 0, date("m")+2, 1, date("Y"))); //print"".$seireki.$tsuki.$hi."今月の日数".$tsukihi."翌月".$yokutsuki."翌月の日数".$yokutsukihi; //11月になったら来年をセレクト可能にする if($tsuki >= "11"){ $tougetsu = "<select id=\"SEL1\" name=\"year\">\r\n<option value=\"\">---</option>\r\n<option value=\"$seireki\">{$seireki}年</option>\r\n<option value=\"$rainen\">{$rainen}年</option></select>\r\n"; }else{ $tougetsu = "<select id=\"SEL1\" name=\"year\">\r\n<option value=\"\">---</option>\r\n<option value=\"$seireki\">{$seireki}年</option>\r\n</select>\r\n"; } //月のセレクト $tsuki1 = date("n"); if($tsuki1 <= "10" ){ //10月より前の月の処理 $tsuki_select = "<select id=\"SEL2\" name=\"month\">\r\n<option value=\"\">---</option>\r\n<optgroup label=\"".$seireki."\">"; for($k = $tsuki1; $k <= $tsuki1 + 2; $k++){ $tsuki_select .= "<option value=\"".$k."\">".$k."月</option>\r\n"; } $tsuki_select .="</optgroup>\r\n</select>"; }else{ //11月より後の処理 $tsuki2 = $yokutsuki; $tsuki3 = $saraigetsu; $tsuki_select = "<select id=\"SEL2\" name=\"month\">\r\n<option value=\"\">---</option>\r\n<optgroup label=\"".$seireki."\">"; for($k = $tsuki1; $k < $tsuki1 + $tsuki2; $k++){ $tsuki_select .= "<option value=\"".$k."\">".$k."月</option>\r\n"; } $tsuki_select .="</optgroup> <optgroup label=\"".$rainen."\">"; for($t = 1; $t <= $tsuki3; $t++){ $tsuki_select .= "<option value=\"".$t."\">".$t."月</option>\r\n"; } $tsuki_select .="</optgroup></select>\r\n"; } //日付のセレクト(当月) $day_select ="<select id=\"SEL3\" name=\"day\"> <option value=\"\">---</option> <optgroup label=\"".$tsuki."\">\r\n"; for($i = $hi; $i <= $tsukihi; $i++){ if(isset($hi) && $hi == $i){ $day_select .="<option value=\"".$i."\" selected=\"selected\">".$i."日</option>\r\n"; }else{ $day_select .="<option value=\"".$i."\">".$i."日</option>\r\n"; } } $day_select .="</optgroup> <optgroup label=\"".$yokutsuki."\">\r\n"; for($j = 1; $j <= $yokutsukihi; $j++){//翌月分 $day_select .="<option value=\"".$j."\">".$j."日</option>\r\n"; } $day_select .="</optgroup> <optgroup label=\"".$saraigetsu."\">\r\n"; for($l = 1; $l <= $saraigetsuhi; $l++){//翌々月分 $day_select .="<option value=\"".$l."\">".$l."日</option>\r\n"; } $day_select .="</optgroup></select>\r\n"; ----表示部---- <td>  <?= $tougetsu ?> <?= $tsuki_select ?> <?= $day_select ?> <script type="text/javascript"> ConnectedSelect(['SEL1','SEL2','SEL3']); </script> </td>

専門家に質問してみよう