2014-03-25 62 views
0

我已經構建了一個顯示12個月期限的簡單PHP日曆。我有一個包含日曆事件的MySQL數據庫。我想用我的活動填充我的日曆。我當然可以每天運行MySQL查詢,但365個查詢似乎效率很低,就像運行單個MySQL查詢並循環遍歷結果365次一樣。如果有的話,什麼是替代方案?有沒有簡單而有效的方法來做到這一點?填充日曆的最有效方法?

+0

所有取決於您想要的日曆的輸出/ UI。 – andrewb

+0

用天作爲鍵創建一個數組,然後在1..365循環內使用它。 – Vatev

+0

什麼是你的餐桌結構? – Kickstart

回答

0
$query = "SELECT idEvent, day, hour , event from calendar where year = 2014 order by day, hour "; 

$calendarEvents = array(); 

if ($result = $mysqli->query($query)) { 

    /* fetch associative array */ 
    while ($row = $result->fetch_assoc()) { 

     $calendarEvents[ $row["day"] ][ $row["idEvent"] ] = $row; 

    } 

    /* free result set */ 
    $result->free(); 
} 

然後你有2014年的數據與1查詢和數組$日曆事件訪問他們。 每一天你必須通過ID的所有事件,所以用foreach循環你的那一天所有事件以相同的查詢順序

for($i = 1; $i < 365 ; $i++){ 

$date = date("Y-m-d" , strtotime("2013-12-31 + $i day")); 

    foreach($calendarEvents[ $date ] as $idEvent => $c){ 

     echo $idEvent . " -- ".$date." - ". $c["hour"]." - ".$c["event"]; 

    } 

} 
+0

我認爲這正是我正在尋找的,謝謝。如果某個特定日期有多個活動,我將如何全部打電話給他們? – Jules

+0

查找編輯,每天通過id添加元素,然後使用foreach循環訪問當天的所有元素。 – chofer

0

給你,每一年的天一行結果集的順序,以及當天的所有事件(如果有的話)連接到另一列,您可以做這樣的事情: -

SELECT DateSub.aDay, GROUP_CONCAT(CONCAT_WS(':', SomeCalendarTable.eventName, SomeCalendarTable.startTime, SomeCalendarTable.endTime)) AS DaysEvents 
FROM 
(
    SELECT DATE_ADD('2014/01/01', INTERVAL (Units.DayNo + Tens.DayNo * 10 + Hundreds.DayNo * 100) DAY) AS aDay 
    FROM 
    (SELECT 1 AS DayNo UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) Units, 
    (SELECT 1 AS DayNo UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) Tens, 
    (SELECT 1 AS DayNo UNION SELECT 2 UNION SELECT 3 UNION SELECT 0) Hundreds 
    HAVING YEAR(aDay) = '2014' 
) DateSub 
LEFT OUTER JOIN SomeCalendarTable 
ON DateSub.aDay = SomeCalendarTable.calendarDate 
GROUP BY DateSub.aDay