Поиск с помощью PHP для календарных дат в массиве MySQL? - PullRequest
1 голос
/ 15 декабря 2009

Я строю календарь, и я действительно тупой, когда дело доходит до массивов. Прежде всего, мне нужно запросить мою базу данных, поэтому:


$events = mysql_query ("SELECT id,title,date WHERE date BETWEEN 2009-01-01 AND 2009-01-31")
or die(mysql_error());

Итак, теперь мне нужно упорядочить эти события, чтобы при отображении таблицы календаря я мог проверить этот массив на наличие событий. В этом великолепном календаре, написанном Дэвидом Уолшем , он делает запросы на каждый день, но я полагаю, это будет кошмар производительности. Итак ... есть идеи, как я могу это сделать?

Ответы [ 3 ]

3 голосов
/ 15 декабря 2009

Сначала убедитесь, что вы сравниваете даты с датами. Я думаю, что ваш код должен быть (то есть с одинарными кавычками date):

$events = mysql_query ("SELECT id,title,date WHERE date 
BETWEEN '2009-01-01' AND '2009-01-31' order by date asc")or die(mysql_error());

при условии date является столбцом даты.

2 голосов
/ 15 декабря 2009

я бы сделал это в элегантном цикле

for($i=0;$i<30;$i++)
{
$events[] =  mysql_fetch_array(mysql_query ("SELECT id,title,date WHERE date BETWEEN 2009-01-01 AND 2009-01-{$i}"));
}

теперь у вас есть массив, делающий что-то с ним, вот так

for($i=0;$i<count($events);$i++)
{ 
  echo $events["id"];
}

будет возвращать каждый идентификатор для событий в этом массиве

1 голос
/ 15 декабря 2009

Хорошо, что касается ваших комментариев, вы можете сделать что-то вроде этого: Получить события, подобные предложенному Дэйвеком (обратите внимание на ORDER BY!)

$events = mysql_fetch_assoc(mysql_query ("SELECT id,title,date WHERE date BETWEEN '2009-01-01' AND '2009-01-31' ORDER BY date asc"));

Тогда вы получили события, упорядоченные по дате. Для вывода вы можете сделать это:

$last_date = null;
foreach($event in $events) {
    if($last_date !== $event['date']) {
        echo 'Events for day ' . $event['date'] . ": \n";
        $last_date = $event['date'];
    }

    echo $event['title'] . "\n"

}

Примечание: это всего лишь грубый набросок, вы, конечно, должны отрегулировать вывод, но он должен дать вам правильное представление.

Вывод будет выглядеть так (в моем примере):

Events for 2009-01-01: 
Event 1
Event 2
Events for 2009-01-02: 
Event 1
.
.
.

Редактировать после комментария:

Вы можете написать свою собственную функцию:

function get_events($date, $events) {
    $result = array();
    foreach($event in $events) {
        if($event['date'] == $date) {
            $result[] = $event;
        }
    }
    return $result;
}

Но так вы будете искать в массиве каждый день снова и снова. Вы можете улучшить его, удалив уже найденные события из массива $events. Так что каждый раз, когда вы ищете в меньшем массиве. Но я сделал бы это только в случае проблем с производительностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...