- ベストアンサー
今日の日付から1週間のリスト
PHPで現在の日付を受け取り1週間後までの日付を表示させるリストを作っています。 年月日すべてが表示されるようにしたいので(年はなくても可)今日であれば <select name=day> <option>2008/01/16</option> <option>2008/01/17</option> ・・・ <option>2008/01/23</option> </select> のように代入したいです。 date関数からdayだけに7を足しても月の変わり目で31日をオーバーしてしまうので <option>2008/01/31</option> <option>2008/02/01</option> と正しく表示させるにはどうすればいいでしょうか?
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
>echo "<select name="send_date">\n"; は文法的にまちがってますね。まあ転記ミスでしょうけど >$date = $_POST[send_date] これも$date = $_POST["send_date"]としましょう。 日付型のデータにしたいなら、前回も書きましたがstrtotime()で。 $date = strtotime($_POST["send_date"]); 元ソースoptionにvalueをきちんと設定しないと値が渡らないことも あるので、以下のようにしてみるといいでしょう。 なおヒアドキュメントで書くと構造がよくわかると思います。 <?PHP $date=strtotime("2008/01/30"); $str=""; for($ii=0;$ii<7;$ii++){ $str_date=date('Y/m/d',$date + $ii * 60*60*24); $str.="<option value='{$str_date}'>{$str_date}</option>\n"; } print <<<eof <form method="get"> <select name="send_date"> {$str} </select> <input type="submit"> </form> eof;
その他の回答 (8)
- fa-ce
- ベストアンサー率42% (9/21)
>データベースではchar型で日付を入れています。 ということなら、 $date = $_POST["date"];//受け取った日付データ($date="2007/01/20"など) $date = "'".$date"'"; としてやって、 日付のカラムにインサートしてあげればいいんじゃないかな? >また、このプログラムでデータベースに入れて値を取り出すときに >さらにこの日付の1週間後を計算することはできるのでしょうか? >例) >購入履歴と有効期限の関係のように >2008/01/16を格納して別のページで >2008/01/16と2008/01/23を取り出すなど ということであれば、 取り出したchar型の日付($date1)を、 list($y,$m,$d) = explode("/",$date1); $day1 = mktime(0, 0, 0,$m,$d,$y ); // mktime (時, 分, 秒, 月, 日, 年, サマータイム); $day2 = $day1+(86400*7); //1日が86400で、7日後なので 86400*7 として、 $date2 = date('Y/n/j',$day2); で日付にしてやれば、 $date1 が 購入履歴 2008/01/16 $date2 が 有効期限 2008/01/23 となると思います
- wp_
- ベストアンサー率54% (132/242)
mysqlのdate型についてよく知る必要があります。 http://dev.mysql.com/doc/refman/4.1/ja/date-and-time-types.html http://dev.mysql.com/doc/refman/4.1/ja/date-and-time-functions.html > $date = $_POST["send_date"] 上記のようにするのであれば > echo "<option>".$y.'/'.$m.'/'.$d."</option>\n"; ここでPOSTする値がmysqlの日付書式に即してなくてはなりません。 echo "<option value='".$y."-".$m."-".$d." 00:00:00'>(snip)</option>"; // 年月日の区切りはハイフンではなかったでしたっけ? また、$_POSTの値をそのまま使用するとSQLインジェクションにつながりますので $date = mysql_real_escape_string($_POST["send_date"]); とすべきでしょう。
- yambejp
- ベストアンサー率51% (3827/7415)
>リストの表示はできたのですがデータベースに格納したときに >例えば2008/01/16だと"/"が割り算となり値が125として入ってしまうのですが・・・ >"-"だと引き算になり他の記号はエラーになってしまいます。 >データベースではchar型で日付を入れています。 日付はdate型でしょう・・・ INSERTやUPDATEする際に、きちんとクォーテーションでくくってますか? SET `日付`='2008/01/16'とすればよいですが、 SET `日付`=2008/01/16ではだめです。 なお/と-は混在さえしなければmysql側で自動的に判断してくれますので どちらでもOKです。 また、mysqlからとりだした日付データはPHP側でstrtotime()して日付 としてあつかい、表示の際にdate()で整形してやればよいでしょう
お礼
now()を入れれば格納も取り出しもできたのですが 前ページからdate型の変数を受け取ってその日付を格納する方法が分かりません。 例えば echo "<select name="send_date">\n"; for($ii=0;$ii<7;$ii++) { list($y,$m,$d) = explodate(",", date('Y,m,d',time() + $ii * 60*60*24)); echo "<option>".$y.'/'.$m.'/'.$d."</option>\n"; } echo "</select>"; でフォームページを作った場合次のページで $date = $_POST[send_date] としても正しくdate型として扱われません。
- saintandre
- ベストアンサー率31% (194/607)
実は mktime 関数は「mktime(0,0,0,5,35,2008)」とかも受け入れてくれるので $d = mktime(0,0,0,date("m"),date("d")+7,date("Y")); でいけます。
- fa-ce
- ベストアンサー率42% (9/21)
<?php $d = 86400; $date = mktime(); for ($i= 0;$i<7; $i++){ $date +=$d; $Date[] = $date; } foreach($Date as $d){ $d = date('Y/n/j',$d); $option.="<option>$d</option>"; } //表示 echo <<< EOF <select name = 'day'> $option </select> EOF; ?>
- Suzi
- ベストアンサー率38% (130/334)
文面だけで回答しています。 「今日」のタイムスタンプをその日付から取ると、例えば1/16 00:00は、$today = 12365699(適当)。 一日は、60秒×60×24 = 86400。$day = 86400 一週間後なので、7回ループさせて表示させるのはどうでしょうか。 <select name=day> for($i = '0'; $i <= '7'; $i++){ $today = $today + (86400 * $i); $week = date('Y/m/d', $today); print "<option>". $week. "</option>\n"; } </select> ・インデント表示に全角を入れてあります ・検証していません ・もっとスマートな記述があるかもしれません
- wp_
- ベストアンサー率54% (132/242)
ぐふ。 explode()噛ましてない。 以下が正しいです。 list($y,$m,$d) = explode(',',date('Y,m,d',time() + $ii * 60*60*24)); 確認したしましたがフォーマットYmdは既に0詰めされていますね。
お礼
ありがとうございます。 リストの表示はできたのですがデータベースに格納したときに 例えば2008/01/16だと"/"が割り算となり値が125として入ってしまうのですが・・・ "-"だと引き算になり他の記号はエラーになってしまいます。 データベースではchar型で日付を入れています。 また、このプログラムでデータベースに入れて値を取り出すときに さらにこの日付の1週間後を計算することはできるのでしょうか? 例) 購入履歴と有効期限の関係のように 2008/01/16を格納して別のページで 2008/01/16と2008/01/23を取り出すなど
- wp_
- ベストアンサー率54% (132/242)
date()の第二引数で翌日以降を指定しましょう。 echo "<select>\n"; for($ii=0;$ii<7;$ii++) { list($y,$m,$d) = date('Y,m,d',time() + $ii * 60*60*24); echo "<option>".$y.'/'.$m.'/'.$d."</option>\n"; } echo "</select>"; // 0詰めしてないので結果は少し違うかもしれませんが。
お礼
ありがとうございます。 非常に参考になりました。