- ベストアンサー
入力した日付の調整法
お世話になります。 PHPからPostgresへデータを検索しにいくシステムを作っています。 ユーザーが ○○年○○月~××年××月 と入力した場合に ○○年○○月~一年後までのデータを表示させたいです。 例えば2000年1月~2002年1月と入力した場合でも 2000年12月までのデータしか表示されない 日付を一度分解して引き算などするのでしょうか。 よろしくお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
>○○年 = p_year …始めの年 >○○月 = p_month …始めの月 ××年 = e_year …終わりの年 ××月 = e_month …終わりの月 $s_y = $_POST['p_year']; $s_m = $_POST['p_month']; $e_y = $_POST['e_year']; $e_m = $_POST['e_month']; $inp_e = date("M-d-Y", mktime(0,0,0,$e_m,1,$e_y)); //入力された終わりの年月日 for( $i=0; $i<12; $i++ ){ $get_e = date("M-d-Y", mktime(0,0,0,$s_m+$i,1,$s_y)); //スタートの月に1~11を加える if($get_e == $inp_e){ //入力と一致したら $end_ym = $inp_e; //入力のままで break; //ループ終わり } else if ($i == 11){ //11まで一致しなかったら $end_ym = $get_e; //11加算したものをセット } } こんな感じでしょうか。ご参考までに。
その他の回答 (6)
- cojirou
- ベストアンサー率50% (59/117)
ちなみに、××月間とする場合は、 >○○年 = p_year …始めの年 >○○月 = p_month …始めの月 ××月間 = period …期間(1~12) $s_y = $_POST['p_year']; $s_m = $_POST['p_month']; $pd = $_POST['period'] - 1; $end_y = ($s_m+$pd > 12 ? $s_y+1 : $s_y ); //終わりの年 $end_m = ($s_m+$pd > 12 ? ($s_m+$pd) % 12 : $s_m+$pd ); //終わりの月 これだけです。ご参考までに。 私もPHP勉強中の身です。お互い頑張りましょう。 度々失礼致しました。
- taba
- ベストアンサー率61% (349/567)
>うまくいかないんです。 何をしたいのかよく分かりません。 そのfor文では12回リピートするだけです。 開始も終了もp_で同じ名前です(これはミス?)。 また、echoしてどうするんですか? 私が#3で書いたのは、while文を使うなどして、終了月と一致するまで各月を希望の書式で配列などに書き出して、それをあとでDBに検索に行くときに使うというようなイメージだったのですが。 今回の質問以外の部分で、基本的なPHPのプログラム作法が分からないときは、いったん解説サイトなどで勉強してから、不明点を絞って質問してください。
お礼
慌てて書き込みしたため入力ミスでした。 分岐させてカウントしていくのですね。 つかめてきました、ありがとうございます。
- cojirou
- ベストアンサー率50% (59/117)
ユーザーの入力は >○○年○○月~××年××月 でなくてはだめなのでしょうか? もし、そうでなくても良いなら、 ○○年○○月~××月間 としては。(××の所は1~12のselectboxとか。) 問題の解答ではなくて申し訳ありませんが、 ご参考までに。
補足
お返事ありがとうございます。 年、月ともにセレクトボックスで選択するようにしています。 2000年10月~2001年の1月まで…という風に入力したいのです。 2000年10月~4ヶ月まで…という風にするのも同じなんですよね。 参考にさせて頂きます。
- taba
- ベストアンサー率61% (349/567)
どう試行錯誤して、どこで困っているのか書いていただけるとありがたいです。 開始月と終了月を入力させるわけですよね。 例えば紹介したページにあるサンプルで、 date ("M-d-Y", mktime (0,0,0,$start_month,1,$start_year)); と日付を作り(書式は適宜変更するとして)、 monthを1ずつ増加させていって、終了月と一致するまでループし、もし一致しなければ12で終わるというようなプログラムでいいんじゃないですか。 それで、必要な日付のリストができると思いますが。 プログラムの詳細が分からないので、後の処理を考えると他のやり方がいいかもしれません。
補足
ソースを載せたほうが早いですよね、失礼しました。 年月の入力はセレクトボックスになります。 教えて頂いたコードでつくってみました。 ○○年 = p_year ○○月 = p_month ××年 = p_year ××月 = p_month $p_year = 2001; $p_month = 10; date ("M-d-Y", mktime (0,0,0,$p_year,1,$p_month)); for ( $i = 0; $i < 12; $i++ ){ echo date(mktime( 0,0,0, $now['p_year']-$i, $now['p_month'] ) ), "<br>"; } うまくいかないんです。 つっこみどころ満載でしょうか。
- taba
- ベストアンサー率61% (349/567)
常に表示が1年間で固定されるなら、開始月だけの入力にしたほうがいいと思います。 もし、3ヶ月とかは認めるのであれば、期間が1年を超えていないかのチェックは必要でしょうね。で、超えていたら、1年で処理するというロジックですね。 mktime関数を参照してください。
補足
回答ありがとうございます。 最高1年の表示で、1~11ヶ月までは選択できるように作っています。 mktimeで試行錯誤しながらやっていますがなかなか組めません。 もう少しヒントを教えてもらえないでしょうか。
もしかして、お使いのコンピュータには2000年12月までのカレンダー機能しか、内臓されていないのではないですか。
お礼
お返事ありがとうございます。 早速試してみたところうまくできました、助かりました。 ご丁寧にコメントまで入れてくださり理解できました。 ありがとうございました。