CakePHPで毎年同じ月日を判定する方法

このQ&Aのポイント
  • 毎年ある時期がくると「開催中」という文字が自動表示される処理を考えているのですが、うまく表示できずに悩んでいます。
  • 具体的にいうと、DATE型の「start」と「end」フィールドを今日の日付とを比較し、「start」と「end」の期間中であればそのテーブルに含まれる文字列(title)を表示するという具合です。
  • 年に関係なく、月日だけで繰り返し判断するにはどうすればよいのか、ぜひご教示ください。
回答を見る
  • ベストアンサー

CakePHPで毎年同じ月日を判定する方法

毎年ある時期がくると「開催中」という文字が自動表示される処理を考えているのですが、うまく表示できずに悩んでいます。 具体的にいうと、DATE型の「start」と「end」フィールドを今日の日付とを比較し、「start」と「end」の期間中であればそのテーブルに含まれる文字列(title)を表示するという具合です。 以下の段階では、年まで一致すれば問題なく表示されるのですが、年が変わると当然ながら表示されなくなってしまいます。 テーブル 「title(タイトル)」「start(開始日)」「end(終了日)」 コントローラ $date = date("Y-m-d", mktime(0,0,0, date("m"), date("d"), date("Y"))); $conditions = array('hoge.start <' => $date,'hoge.end >' => $date); $this->set('data',$this->hoge->find('all',array('conditions'=>$conditions))); ビュー foreach($data as $data){ echo $data['hoge']['title']"; } 年に関係なく、月日だけで繰り返し判断するにはどうすればよいのか、ぜひご教示ください。

  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
回答No.2

すみません。そんな処理はすっぽり抜けてましたね。 まず、 startとendが入力された場合に、 start = 11月 end = 2月 など、多い数値から少ない数値まで、と入力された場合は、 2000-11から 2001-02まで というようにデータベースに登録し、 当てる月を、 2000-5 または 2001-5 を検索してやれば要件を満たせそうです。 CakePHPであれば、 <?php $date = date('2000-m-d', time()); $date2=date('2001-m-d', time()); $conditions = array( 'or' => array( array('hoge.start <' => $date,'hoge.end >' => $date), array('hoge.start <' => $date2,'hoge.end >' => $date2), ), ); ?> とすれば、それぞれがOR条件に出来ます。 ※一応紙に、タイムライン引いて大丈夫そうか確認してみたんですけど、質問者さんも一度確認してみてください・・・

misoshio
質問者

お礼

早速のご回答ありがとうございます。 おかげさまで無事に動作しました。 こんなときは「or」でいいんですね。 恥ずかしながらまったく気がつきませんでした。 貴重なお時間を割いてくださり本当にありがとうございました。

その他の回答 (1)

回答No.1

深い部分での意図を外しているかもしれませんが、 まず、startとendに入力される値と、検索する場合の値を考えた場合に、 入力値の年を必ず固定し、検索値の値も必ず固定するようにしてしまえばいいのではないですか? 例えばstart/endに入力させるフォーム項目は、月と日だけにして、保存時に、「2000」年を付加して保存 検索値も、 <?php $date = date('2000-m-d', time()); ?> などとして年は無視した値を検索してやるとか。 どうでしょう。

misoshio
質問者

補足

hogehoge78様 ご回答ありがとうございます。 おっしゃるとおり年を固定したらうまくいったのですが、年をまたぐとうまく拾えません。 もし、そんな場合のシンプルな対象法をご存じでしたらご教示いただけますでしょうか。

関連するQ&A

  • 時間の加算(その2)php

    DBからある範囲の日付けの時間だけを取ってきて取ってきた時間の差分の累計を計算したいです。 例えば、4月16日から5月15日までのスタート時間とエンド時間を所得 させてエンド引くスタート、日々の差分を累計するようなことが実現したいです。 下記のように書いてデータだけは引っ張ってこれるようになったのですが加算方法が分かりません。ご教授いただけませんでしょうか? (ソース?php $ym = date("2022-04-22"); $tm = date("n",strtotime($ym));//月 $ty = date("Y",strtotime($ym));//年 $countdate=date('t',mktime(0,0,0,$tm,1,$ty));//4月の日数を計算 for ($i = 0; $i < $countdate; ++$i) { $d = mktime(0, 0, 0, $tm, 16 + $i, $ty); //日付ごとの配列のキー $dd = date('Y-m-d', $d); foreach($e_all as $e_time){ if (in_array($dd, (array)$e_time->date_time)) { echo $e_time->start_time;   echo $e_time->end_time; }} } ?> 因みにechoで表示されたデータは 09:00:00 20:00:00 08:00:00 18:00:00 09:00:00 19:10:00 となっていて 順番に登録してある4/20 のスタート時間、エンド時間 4/21のスタート時間、エンド時間4/22のスタート時間、エンド時間 の並びで取れています。よろしくおねがいします

    • ベストアンサー
    • PHP
  • CakePHPでテーブルからデータを選択したデータを受け渡し、次ページで表示する動作について

    現在CakePHPを使用して研修用の受講登録ページを作成しています。 やりたい事としては、 (1)ページ1でデータベースに入っているコース一覧をテーブルに表示 (2)ページ1で各行にチェックボックスがついており、選択したコースのIDを次ページに受け渡しする。 (3)ページ2で受け取ったデータ(コースのID)を元にFindで検索、テーブルに表示する。 といった感じです。 現在(2)まではできているのですが、(3)の部分でうまくいかずに困っています。 現在の状態は、(2)の部分ではチェックボックスの名前をコースのIDと同じ数字にし選択したチェックの数値と、何件選択したかをカウントしたものを変数に入れてFormにて受け渡しています。 そして、(3)で受け取ったデータを元にFindをかけたいのですが、Findの部分でどういった記述をすればいいのかわからず1週間ほど困っています。 グーグルでFindについて検索をしてみたものの、有効な答えを得られなかったので質問させて頂きます。よろしくお願いします。 なお、現在Findの部分は $conditions = array(  'conditions' => array(   'or' => array( for ($a=0;$a < $kensuu;$a++){ $data = $this->params['form'][$a]; if ($data == 1){ $check = 1; $count++; } if ($check == 1){ $sdata .= array('courceID' => '$a'); $a++; $data = $this->params['form'][$a]; if ($a == $kensuu){ $sdata .= array('courceID' => '$a'); $count++; } $a--; } $check = 0; } //$conditions = $conditions . $sdata; //$conditions .= ",),),);"; $sentakudata = $this->Pobs->find('all', $conditions); $this->set('sentakudata', $sentakudata); と、途中で止まっています。 選択したデータを $conditions = array(  'conditions' => array(   'or' => array( array('courceID' => '○○'), array('courceID' => '○○'), と、いった感じで自動で条件の部分に追加していきたいのです。

    • 締切済み
    • PHP
  • cakephpでキーワード検索

    すみません。いろいろやってみたんですが 断念して、ここに投稿しました。 検索キーワードでページングするための方法がわかりません。 例)東京 寿司屋 このようにスペースで単語ごとに区切ります。 一文字だけは成功しましたが、スペースを空けて単語を読みとる 方法が浮かびません。 $keyword = mb_convert_kana($this->data["Hoge"]["keyword"],'rnask'); $keywords = preg_split("/[\s]+/",$keyword); $set = array(); $set = array( 'OR' => array( 'Hoge.name LIKE' => '%'.$keywords[0].'%', 'Hoge.prefecture LIKE' => '%'.$keywords[0].'%', 'Hoge.job LIKE' => '%'.$keywords[0].'%', ), //'OR' => array( //'Hoge.name LIKE' => '%'.$keywords[1].'%', //'Hoge.prefecture LIKE' => '%'.$keywords[1].'%', //'Hoge.job LIKE' => '%'.$keywords[1].'%', //), // コメントをはずしてみると、案の定エラーこきます。 'Hoge.cp_flag' => 1, ); $this->set("hogehoes",$this->paginate('Hoge',$set,null)); お願いします。どなたかお助け下さい。

    • ベストアンサー
    • PHP
  • php テーブルの項目のループを分ける方法

    phpで勤務管理のプログラムを書いています。 テーブルの項目を日付($date)、曜日($youbi)、区分($kubun)、開始($start)、終了($end)、休憩($rest)として 日付と曜日は下記のループ分で日付に曜日を紐付けてループさせて 出来ています。(16日~翌月15日)ただ、区分、開始、終了、休憩は入力画面から取ってくるようにしているのですが、同じデータが日付けのループ分表示されてしまします。 日付け・曜日のループとデータ部分(開始・終了・休憩)のループは 別にしたいのですが可能でしょうか? <?php $kubun=$_POST["kubun"]; $start=$_POST["start"]; $end=$_POST["end"]; $rest=$_POST["rest"]; if($end>22.00){ $sasa=$end-22; $sa=""; }elseif($end<=22.00){ $sa=$end-$start-$rest-8; $sasa=""; } $youbi = array("日","月","火","水","木","金","土"); $countdate=date('t',mktime(0,0,0,11,1,2021)); for($i=0;$i<$countdate;$i++){ $d=mktime(0,0,0,11,16+$i,2021); echo '<tr>'; print '<td align="right">'.date("d",$d).'</td>'; echo '<td align="right">'.$youbi[date("w",$d)].'</td>'; echo '<td align="right">'.$kubun.'</td>'; echo '<td align="center">'.$start.'</td>'; echo '<td align="center">'.$end.'</td>'; echo '<td align="center">'.$rest.'</td>'; ?>

    • ベストアンサー
    • PHP
  • CakePHPでのコメント数表示について

    CakePHPを使って簡単な掲示板を開発しているのですが、トップページに 各トピックについたコメント数を表示させる方法で壁にぶち当たってしまっております。 データの取り出し方及び表示方法について教えて頂ければと思います。 DB構造(モデル)としては、 ==================================== ■掲示板(post.php) テーブル:posts id title contents ■コメント(comment.php) テーブル:comments id post_id comment ==================================== となっており、postsにhasMany、commentsにbelongsToで アソシエーションを貼ってあります。 コントローラー(posts_controller.php)では、 ==================================== $data = $this->Post->find('all',array('order' => array('Post.id' => 'desc'))); $this->set('data',$data); ==================================== という処理を行い、 ビュー(/posts/index.ctp)では、 ==================================== foreach($data as $val){ echo "<tr>"; echo "<td><a href='{$val['Post']['id']}'>$val['Post']['title']</a></td>"; echo "</tr>"; } ==================================== としています。 これで、トップページに行くと掲示板トピックスのタイトルの 一覧は表示できるのですが、その横についたコメント数を表示 させたいのです。 例)掲示板のタイトルです(13) 上記のように(○)とさせたいのです。 コントローラーの所でallではなくcountにすることで件数を取りだす ことができる所まではできるのですが、 $cnt = $this->Post->find('count',array('order' => array('Post.id' => 'desc'))); などとやっても本来取り出したいcommentsではなくpostsの件数を取りだす ことになってしまっています。 また、hasManyを利用すると、 Array( [0] => Array( [post] => Array( [id] => 1 [title] => 掲示板のタイトルです [contents] => 掲示板の内容です [comment] => Array( [0] => Array( [id] => 1 [post_id] => 1 [comment] => コメント1です。 [1] => Array( [id] => 2 [post_id] => 1 [comment] => コメント2です。 ・ ・ ・ となる為、ビューでの表示のさせ方にも困っております。

    • ベストアンサー
    • PHP
  • 明日以降の平日表示

    ちょっと頭がこんがらがってわからなくなってしまいました。 明日以降の平日の日付を取得・表示するスクリプトを考えております。 ========= <? $youbi = array("日","月","火","水","木","金","土"); $d=mktime(0,0,0,date("m"),date("d")+1,date("y")); if(date("w",$d)==6) $d=$d+60*60*24*2; if(date("w",$d)==0) $d=$d+60*60*24*2; $theday = date("Y年m月d日",$d)." (".$youbi[date("w",$d)].")"; print $theday; ?> <? $youbi = array("日","月","火","水","木","金","土"); $d=mktime(0,0,0,date("m"),date("d")+2,date("y")); if(date("w",$d)==6) $d=$d+60*60*24*2; if(date("w",$d)==0) $d=$d+60*60*24*2; $theday = date("Y年m月d日",$d)." (".$youbi[date("w",$d)].")"; print $theday; ?> <? $youbi = array("日","月","火","水","木","金","土"); $d=mktime(0,0,0,date("m"),date("d")+3,date("y")); if(date("w",$d)==6) $d=$d+60*60*24*2; if(date("w",$d)==0) $d=$d+60*60*24*2; $theday = date("Y年m月d日",$d)." (".$youbi[date("w",$d)].")"; print $theday; ?> <? $youbi = array("日","月","火","水","木","金","土"); $d=mktime(0,0,0,date("m"),date("d")+4,date("y")); if(date("w",$d)==6) $d=$d+60*60*24*2; if(date("w",$d)==0) $d=$d+60*60*24*2; $theday = date("Y年m月d日",$d)." (".$youbi[date("w",$d)].")"; print $theday; ?> この方法だとなぜか、 ============ 2007年08月27日 (月) 2007年08月28日 (火) 2007年08月27日 (月) 2007年08月28日 (火) ============ となります。 どこがおかしいのでしょうか?

    • ベストアンサー
    • PHP
  • 開始日と終了日が設定されているデータの扱いについて

    開始日と終了日が設定されているデータの扱いについて教えてください。 すでに複数登録されているデータには、開始日と終了日というフィールドが登録されています。  → "開始日","終了日","箱1","箱2" → "051101","051130","a1","a2" → "051201","051231","b1","b2" 新しいデータを追加する際、すでに登録された期間に被っていた場合はエラー表示させたいのですが、そのやり方がわかりません。 (※12月1日~12月31日までというデータがすでに登録されていた場合、  11月1日~12月15日というデータは登録できない、という感じです) とりあえず下記のようにやったりしているのですが、 どうも思ったように動いてくれません また、SELECTを使うものなのか疑問に思っています。 $start_date = "2005-12-01" $end_date = "2005-12-31" $hoge = "SELECT * FROM table_name WHERE ( date_start<='"$start_data"' AND date_end>='"$start_data"' ) OR ( date_start<='"$end_data"' AND date_end>='"$end_data"')"; $db_query = sql_query($hoge,$ID); $array_result = mysql_fetch_array($db_query); if(empty($date_start_check) != TRUE ){ die("この期間内のデータはすでに登録されています。"); } 何卒、良いやり方を教えてくださいm(_ _)mペコリ

    • ベストアンサー
    • MySQL
  • laravel controllerに記載したい

    以前、回答いただいた内容で現在view側に書いている内容が view側に記入してあると肥大化するのでcontroller側に書きたいのですが可能でしょうか?foreachで回しているのでviewにかくしかないでしょうか?もしも可能であればcontroller側へのデータの渡し方も教えていただけるとありがたいのですが。。。よろしくお願いします。 $ym = date("2022-04-22"); $tm = date("n",strtotime($ym));//月 $ty = date("Y",strtotime($ym));//年 $countdate=date('t',mktime(0,0,0,$tm,1,$ty));//4月の日数を計算 $goukei = 0; for ($i = 0; $i < $countdate; ++$i) { $d = mktime(0, 0, 0, $tm, 16 + $i, $ty); //日付ごとの配列のキー $dd = date('Y-m-d', $d); foreach($e_all as $e_time){ if (in_array($dd, (array)$e_time->date_time)) { echo $e_time->start_time; echo $e_time->end_time; $sabun = (strtotime($e_time->end_time) - strtotime($e_time->start_time)) / 60; echo $sabun; $goukei += $sabun; echo $goukei; } } }

    • ベストアンサー
    • PHP
  • CakePHPでvalidateのメッセージの表示

    バリデーションで設定したエラーメッセージをsetFlashで表示したいのですが、 エラーメッセージ(下記のhoge)を取得する方法はありますか? CakePHP 2x Model public $validate = array( 'username' => array( 'rule' => 'notEmpty' 'message' => 'hoge' ) ); Controller $this->Session->setFlash('test'); $this->redirect('index');

    • 締切済み
    • PHP
  • CakePHPの表の更新・追加・削除の方法について

    CakePHPを使用して開発を行っております。表の更新・追加・削除について質問させてください。 現在は以下のようして、更新・追加・削除を行っております。 ・html <tr> <td><input type="hidden" name="hoge[0][id]" value="10" ><input name="hoge[0][col_1]"></td><td><input name="hoge[0][col_2]"></td> </tr> <tr> <td><input type="hidden" name="hoge[0][id]" value="11" ><input name="hoge[1][col_1]"></td><td><input name="hoge[1][col_2]"></td> </tr> ・cake $this->request->dataで以下を取得して、 hoge=>array( 0=>array( 'id'=>10, 'col_1'=>'', 'col_2'=>'', ), 1=>array( 'id'=>11, 'col_1'=>'', 'col_2'=>'', ) ) ループで1レコードづつsave()しています。 foreach($this->request->data['hoge'] as $v){ $this->create();//初期化処理 $this->save($v);//save()はidの値が既にテーブルに存在すれば、update。存在しなければ、insertする。 } 表で行の削除の場合は、jsで論理削除用のカラムのvalueを変更して、レコードをhidden()しています。 表で行の追加は、非表示で用意している以下をjsで取得後、REPLACEを数値(表の行数+1)に置換して、表の最下部に追加しています。 <tr> <td><input name="hoge[REPLACE][col_1]"></td><td><input name="hoge[0][col_2]"></td> </tr> <tr> <td><input name="hoge[REPLACE][col_1]"></td><td><input name="hoge[1][col_2]"></td> </tr> 前置きが長くなりましたが、ここからが質問になります。 行追加の処理が、別で表を用意していて冗長のため改善したいと考えています。 対策として、表の最下部を取得してきて、数値部分をインクリメントして、表に追加するという案を考えたのですが、もっと良い方法があるような気がしています。(nameのつけ方などで何かないかなど) 表の更新・追加・削除でスタンダードな方法や、他の方がどのようにやっているのかを知りたいです。 どうぞよろしくお願いします。 ※ CakePHPのバージョン : 2.3 jQueryのバージョン : 1.7

    • 締切済み
    • PHP

専門家に質問してみよう