プロが教えるわが家の防犯対策術!

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>

と正しく表示させるにはどうすればいいでしょうか?

A 回答 (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;
    • good
    • 0
この回答へのお礼

ありがとうございます。
非常に参考になりました。

お礼日時:2008/01/18 20:27

>データベースでは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
となると思います
    • good
    • 0

mysqlのdate型についてよく知る必要があります。


http://dev.mysql.com/doc/refman/4.1/ja/date-and- …
http://dev.mysql.com/doc/refman/4.1/ja/date-and- …

> $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"]);
とすべきでしょう。
    • good
    • 0

>リストの表示はできたのですがデータベースに格納したときに


>例えば2008/01/16だと"/"が割り算となり値が125として入ってしまうのですが・・・
>"-"だと引き算になり他の記号はエラーになってしまいます。
>データベースではchar型で日付を入れています。

日付はdate型でしょう・・・
INSERTやUPDATEする際に、きちんとクォーテーションでくくってますか?
SET `日付`='2008/01/16'とすればよいですが、
SET `日付`=2008/01/16ではだめです。

なお/と-は混在さえしなければmysql側で自動的に判断してくれますので
どちらでもOKです。
また、mysqlからとりだした日付データはPHP側でstrtotime()して日付
としてあつかい、表示の際にdate()で整形してやればよいでしょう
    • good
    • 0
この回答へのお礼

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型として扱われません。

お礼日時:2008/01/17 11:38

実は mktime 関数は「mktime(0,0,0,5,35,2008)」とかも受け入れてくれるので



$d = mktime(0,0,0,date("m"),date("d")+7,date("Y"));

でいけます。
    • good
    • 0

<?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;
?>
    • good
    • 0

文面だけで回答しています。



「今日」のタイムスタンプをその日付から取ると、例えば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>

・インデント表示に全角を入れてあります
・検証していません
・もっとスマートな記述があるかもしれません
    • good
    • 0

ぐふ。


explode()噛ましてない。
以下が正しいです。

list($y,$m,$d) = explode(',',date('Y,m,d',time() + $ii * 60*60*24));

確認したしましたがフォーマットYmdは既に0詰めされていますね。
    • good
    • 0
この回答へのお礼

ありがとうございます。
リストの表示はできたのですがデータベースに格納したときに
例えば2008/01/16だと"/"が割り算となり値が125として入ってしまうのですが・・・
"-"だと引き算になり他の記号はエラーになってしまいます。
データベースではchar型で日付を入れています。

また、このプログラムでデータベースに入れて値を取り出すときに
さらにこの日付の1週間後を計算することはできるのでしょうか?

例)
購入履歴と有効期限の関係のように
2008/01/16を格納して別のページで
2008/01/16と2008/01/23を取り出すなど

お礼日時:2008/01/16 22:15

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詰めしてないので結果は少し違うかもしれませんが。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!