Tarifeli Olaylar gösteriliyor

3 Cevap php

Ben birkaç yıl önce bu sorun vardı ve geri sonra ben projeyi sunmak için bir "farklı mantık" uygulanan ancak şüphe aklımda kalır ve umarım sizin yardımınızla ben şimdi bunu anlamak mümkün olacak.

Ben ya da birkaç gün içinde spawn olmayabilir benim veritabanında bazı planlanan etkinlikler olduğunu varsayalım:

id    event           start          end
-----------------------------------------------
1     fishing trip    2009-12-15     2009-12-15
2     fishCON         2009-12-18     2009-12-20
3     fishXMAS        2009-12-24     2009-12-25

Şimdi bir takvimde olayları görüntülemek isteyen, Aralık ayı atalım:

for ($day = 1; $day <= 31; $day++)
{
    if (dayHasEvents('2009-12-' . $day) === true)
    {
    	// display the day number w/ a link
    }

    else
    {
    	// display the day number
    }
}

Ne sorgusu dayHasEvents() function gün olaylar vardır (ya da değil) kontrol için ne yapmalıyım? I SELECT .. WHERE .. BETWEEN burada en mantıklı ama bunu uygulamak için nasıl hiçbir fikrim tahmin ediyorum. Doğru yönde muyum?

Şimdiden teşekkürler!


@James:

Üzerinde olduğumuz diyelim December 19th:

SELECT *
FROM events
WHERE start >= '2009-12-19 00:00:00'
  AND end <= '2009-12-19 23:59:59'

event #2 return, ama hiçbir şey döndürür olmalıdır. = \

3 Cevap

Sen doğru yolda kesinlikle konum. İşte bunu yapıyor hakkında gitmek nasıl:

SELECT *
FROM events
WHERE start <= '2009-12-01 00:00:00'
  AND end >= '2009-12-01 23:59:59'

Ve tabii ki sadece kontrol ediyoruz gün bu tarih değerlerini değiştirin.

Eğer bu yaklaşım çizik ve sadece N ayın gün sayısı N sorguları aksine tek bir sorgu gerçekleştirmek gerekir böylece ön belirli bir ay için tüm olayları kapmak gerekir.

Daha sonra şöyle bir boyutlu dizide döndürülen sonuçları depolamak:

// assume event results are in an array of objects in $result
$events = array();
foreach ($result as $r) {
    // add event month and day as they key index
    $key = (int) date('j', strtotime($r->start));
    // store entire returned result in array referenced by key
    $events[$key][] = $r;
}

Şimdi anahtar gün olmak bir ay için olayların çok boyutlu bir dizi olacak. Herhangi bir olay yaparak, belirli bir günde varsa kolayca kontrol edebilirsiniz:

$day = 21;
if (!empty($events[$day])) {
    // events found, iterate over all events
    foreach ($events[$day] as $event) {
        // output event result as an example
        var_dump($event);
    }
}

James SQL deyimini doğru fikri vardır. Sen kesinlikle bir for döngü içinde birden fazla MySQL SELECT s çalıştırmak istemiyorum. daysHasEvents biterse bir SELECT Bu 31 ayrı SQL sorguları bulunuyor. Ah! Ne bir performans katil.

Bunun yerine, (bir SQL sorgusunu kullanarak) bir diziye etkinlik ve daha sonra gün boyunca yineleme ayın günlerini yükleyin. Böyle bir şey:

$sql= "SELECT start, end FROM events WHERE start >= '2009-12-01' AND end <= '2009-12-31'";
$r= mysql_query($sql);
$dates= array();
while ($row = mysql_fetch_assoc($r)) {
  // process the entry into a lookup
  $start= date('Y-m-d', strtotime($row['start']));
  if (!isset($dates[$start])) $dates[$start]= array();
  $dates[$start][]= $row;
  $end= date('Y-m-d', strtotime($row['end']));
  if ($end != $start) {
    if (!isset($dates[$end])) $dates[$end]= array();
    $dates[$end][]= $row;
  }
}

// Then step through the days of the month and check for entries for each day:
for ($day = 1; $day <= 31; $day++)
{
    $d= sprintf('2009-12-%02d', $day);
    if (isset($dates[$d])) {
        // display the day number w/ a link
    } else {
        // display the day number
    }
}

Amaçlar için daha iyi bir SQL deyimi başlangıç ​​tarihini ve her gün olayların sayısını kapmak biri olacaktır. Başlangıç ​​sütun hiçbir zaman bileşeni ile tarih sütunu ise bu deyim yalnızca düzgün çalışır:

$sql= "SELECT start, end, COUNT(*) events_count FROM events WHERE start >= '2009-12-01' AND end <= '2009-12-31' GROUP BY start, end";