PHP и MySQL календарь проблема

0

Я пишу, пытаясь создать календарь с нуля. Я использую функцию, написанную Дэвидом Уолшем (см. Ссылку), и это здорово. Он выполняет запрос для каждой ячейки дня. Но, боюсь, что когда script нужно будет запускать 30 запросов в каждом рендере, это будет похоже на sloooow.

Итак, я пытался мыслить в другой логике, например, сделать большой запрос с даты X до даты Y в начале script, а затем, в каждый день, проверить, действительно ли этот конкретный день имеет событие в предыдущем запросе. Но я не знаю, как это сделать... Итак, если кто-то может помочь, пожалуйста, кричите!

Спасибо.

  • 1
    Я даже не могу поверить, что парень публикует код с запросом в цикле;)
  • 0
    В комментариях он говорит, что это ради простоты статьи.
Показать ещё 1 комментарий
Теги:
calendar

2 ответа

3
Лучший ответ

Вместо

  /* keep going with days.... */ 
  for($list_day = 1; $list_day <= $days_in_month; $list_day++):
      $calendar.= '<td class="calendar-day">';
      /* add in the day number */ 
      $calendar.= '<div class="day-number">'.$list_day.'</div>';

      /** QUERY THE DATABASE FOR AN ENTRY FOR THIS DAY !!  
          IF MATCHES FOUND, PRINT THEM !! **/ 

      $calendar.= str_repeat('<p>&nbsp;</p>',2);
      $calendar.= '</td>';
      if($running_day == 6):
          $calendar.= '</tr>';
          if(($day_counter+1) != $days_in_month):
              $calendar.= '<tr class="calendar-row">';
          endif;
          $running_day = -1;
          $days_in_this_week = 0;
      endif;
      $days_in_this_week++; $running_day++; $day_counter++;
  endfor;

делать

   /** QUERY THE DATABASE FOR AN ENTRY FOR THE PERIOD !!  
          IF MATCHES FOUND, STORE THEM !! **/ 
  $entries = getEntriesFromDB($month,$year);

  /* keep going with days.... */ 
  for($list_day = 1; $list_day <= $days_in_month; $list_day++):
      $calendar.= '<td class="calendar-day">';
      /* add in the day number */ 
      $calendar.= '<div class="day-number">'.$list_day.'</div>';
      if ($entries[$list_day]):
          /** ADD THE ENTRIES FOR THE DAY!! **/
      endif;
      $calendar.= str_repeat('<p>&nbsp;</p>',2);
      $calendar.= '</td>';
      if($running_day == 6):
          $calendar.= '</tr>';
          if(($day_counter+1) != $days_in_month):
              $calendar.= '<tr class="calendar-row">';
          endif;
          $running_day = -1;
          $days_in_this_week = 0;
      endif;
      $days_in_this_week++; $running_day++; $day_counter++;
  endfor;

Более серьезно, в первом случае у вас будет запрос типа

SELECT date,event from entries where date = $date

и теперь у вас будет

SELECT date,event from entries where date between $date_minus_one_month and $date

Затем сохраните результаты в ассоциативном массиве, индексированном по дням.

  • 0
    Да! это то, что я говорю. Но мой вопрос: мне нужно использовать многомерный массив? Как мне найти в запросе события этого конкретного дня и извлечь идентификатор, время, заголовок, описание и т. Д ....
  • 0
    Как показывает последний запрос. Вам нужен ассоциативный массив, в котором вы указываете дату на массив со всеми данными. Например, если в 2009-10-01 было два события, эквивалентных $ events ['2009-10-01'] = array (массив ($ id, $ time, $ title, $ description), массив ($ id2, $ time2) , $ title2, $ description2)) будет записано (конечно, объявление вложенного массива будет сделано через цикл)
Показать ещё 2 комментария
0

Да, я бы пошел с твоим... эм... смелым предложением. Как указано выше, нет смысла запускать запрос в цикле. Что именно вам нужна помощь, тогда?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню