在for循环中查询的正确方法

时间:2014-02-28 04:55:23

标签: php wordpress for-loop

我是否在WP Answers上发布这个或者因为我在谈论wp_Queries而感到矛盾,但我认为这更像是一个普通的PHP问题,所以这里有。

我正在项目中构建一个事件日历功能。如果你需要一个视觉:http://theseattlevine.com/wordpress2014/calendar/?m=Feb&y=2014

,我在这里可以看到我所拥有的

使用与date()和strtotime()函数通信的查询参数生成天数(由正方形表示,就像普通日历一样),该函数生成当月的适当天数并在月份上开始月份适当的一天(周一至周日)。我使用for循环根据每个月的天数生成有限次数的方块。

现在,在我想要的每个广场内,显然有一个当天发生的事件清单。在我的大脑中,最合乎逻辑的方法是在每个方格中有一个查询循环,找到日期在当天凌晨12:00到晚上11:59之间的所有事件,然后只回显每个事件的标题。但是,似乎这种类型的查询在for循环中不起作用,而且我所做的研究使我相信在for循环中放置一个循环是一个坏主意,因为它会创建一个大数字或请求服务器。

最后,我的问题是,最好的方法是什么呢?如何在每次出现for循环时查询数据库中的帖子(如Wordpress中的wp_query)?

2 个答案:

答案 0 :(得分:1)

如果您创建另一个以下列格式存储数据的表:   日期||活动名称

然后从这个表中查询特定日期将非常容易。

答案 1 :(得分:1)

我会尝试以不同的方式进行操作。在一个页面上投掷30xn请求,并且有m个用户查看该页面,您的数据库最终会哭。

这个怎么样?

  1. 从SQL获取当月的所有事件,将它们放入如下数组中:$event[$dayofmonth][title]=$title

  2. $date[$weeknumber][$dayofweek]=$dayofmonth等表单中获取另一个数组,以帮助构建日历框架

  3. 然后,当您遍历$ date来构建日历框架时,您可以使用$ dayofmonth来引入事件标题,或者如果您将其构建到事件数组中,则需要更多详细信息。

    < / LI>

    这样你只需要1个查询(你很有可能只使用php来构建那个$ date数组。

    示例代码如下:

    /********** Build $event **********/
    $result=however_you_get_your_mysql_result(); //You bound to know the SQL part.. the result set should already be filtered to just this month only
    $event=array();
    foreach($result as $r){  // In here I assume you have at least a title and a event_start_time in resultset
       $dayofmonth=date("Y-m-d",strtotime($r['even_start_time'])); // To get just the date part
       $event[$dayofmonth]['title']=$r['title'];
       $event[$dayofmonth]['detail']=$r['detail']; // If you have detail or other fields.
    }
    
    /********** Build $date **********/
    $when=date('Y-m-d'); // Let's say this month
    $year=date('Y', strtotime($when));
    $first_week_of_month=date('W', strtotime(date('Y-m',strtotime($when))));  //wk number of first day in month
    $last_week_of_month=date('W',strtotime(date('Y-m-t', strtotime($when)))); // wk number of last day in month
    $date=array();
    for($w=$first_week_of_month; $w<$last_week_of_month+1; $w++){ // Set Week boundary 
       for($d=1; $d<8;$d++){  // For 7 weekdays
          $dayofmonth=date('Y-m-d',strtotime($year."W".$w.$d));
          $date[$w][$d]=$dayofmonth;
       }
    }