Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод пользователю обновлений на сайте 
:(
    Опции темы
Valdo
Дата 25.11.2010, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



Доброго времени суток!

Пытаюсь решить следующую задачу:

Пользователь входит на сайт. Дабы быть ему в курсе произошедших на сайте событий, на специально отведенной для них странице, пользователю выводятся все события, произошедшие на сайте за 8 дней (к примеру).

Действия, которые предпринял для решения поставленной задачи:

Код

// на сколько дней выводим обновления
$config['news_days'] = 8;

// текущая дата в unix
$nowtime = time() + ( 360 * 60 );

$month = array(
 '1' => 'января', '2' => 'февраля', '3' => 'марта', '4' => 'апреля', 
'5' => 'мая', '6' => 'июня', '7' => 'июля', '8' => 'августа', 
'9' => 'сентября', '10' => 'октября', '11' => 'ноября', '12' => 'декабря' );

$start_time = strtotime( date( 'd.m.Y' ) );
$end_time = $start_time - ( 86400 * $config['news_days'] );

// в массив помещаем события
$new = array();

// извлекаем записи с пользователями в промежутке между заданными датами (`reg_date` - дата регистрации в unix)
$sel_members = "SELECT * FROM `members` WHERE `reg_date` BETWEEN '" . $end_time . "' AND '" . $nowtime . "' ORDER BY `reg_date` DESC";
$res_sel_members = mysql_query( $sel_members, $dbcnx );
        
if( mysql_num_rows( $res_sel_members ) > 0 )
    {
        while( $arr = mysql_fetch_array( $res_sel_members ) )
            {
                $tnews = 'Зарегистрировался новый участник <a href="member.php?id=' . $arr['member_id'] . '">' . $arr['nickname'] . '</a>';
                $new[$arr['reg_date']] = $tnews;
            }
    }

// извлекаем записи с публикациями в промежутке между заданными датами (`add_time` - дата добавления публикации)
$sel_articles = "SELECT * FROM `articles` WHERE `add_time` BETWEEN '" . $end_time . "' AND '" . $nowtime . "' ORDER BY `add_time` DESC";
$res_sel_articles = mysql_query( $sel_articles, $dbcnx );
        
if( mysql_num_rows( $res_sel_articles ) > 0 )
    {
        while( $rows = mysql_fetch_array( $res_sel_articles ) )
            {
                $art_new = 'Добавлена новая статья <a href="article.php?id=' . $rows['id'] . '">' . $rows['title'] . '</a>';
                $new[$rows['add_time']] = $art_new;
            }
    }

// сортируем массив по ключам в порядке убывания
krsort( $new );



Получился массив примерно следующего содержания:


Код

Array
(
    [1290683260] => Добавлена новая статья ***
    [1290630243] => Зарегистрировался новый участник ***
    [1290554760] => Добавлена новая статья  ***
    [1290541269] => Зарегистрировался новый участник  ***
    [1290532438] => Добавлена новая статья  ***
)



Идем дальше:

Код

// выводим все имеющиеся обновления по дням
for( $i = 1; $i <= $config['news_days']; $i++ )
    {
        $dt = date( 'd.m.Y', $start_time );
        $exp = explode( '.', $dt );
        $dat = $exp[0] . ' ' . $month[$exp[1]] . ' ' . $exp[2];
        
        if( $i == 1 )
            {
                $where = 'Сегодня, ' . $dat;
            }
        elseif( $i == 2 )
            {
                $where = 'Вчера, ' . $dat;
            }
        elseif( $i == 3 )
            {
                $where = 'Позавчера, ' . $dat;
            }
        else
            {
                $where = $dat;
            }
        
        echo '<strong>' . $where . '</strong>' . "<br /><br />";
                
        // получаем дату (день, месяц, год, 00:00:00) на день вперед
        $ntime = $start_time + 86400;
        
        foreach( $new as $key => $value )
            {
                if( ( $key > $start_time ) && ( $key < $ntime ) )
                    {
                        echo date( 'H:i', $key ) . ' - ' . $value . "<br />";
                    }
            }
        

        echo "<br /><br />";
        
        $start_time = $start_time - 86400;
    }


Результат выполнения приблизительно следующий:

Сегодня, 25 ноября 2010

Вчера, 24 ноября 2010

20:24 - Зарегистрировался новый участник ***

Позавчера, 23 ноября 2010

23:26 - Добавлена статья ***
19:41 - Зарегистрировался участник ***
17:13 - Добавлена статья ***
13:01 - Зарегистрировался участник ***
02:16 - Зарегистрировался участник ***

22 ноября 2010

00:50 - Зарегистрировался участник ***
00:39 - Зарегистрировался участник ***

21 ноября 2010

20 ноября 2010

19 ноября 2010

17:13 - Зарегистрировался участник ***
14:26 - Добавлена статья ***

18 ноября 2010

----------------------

Из примера видно, что на некоторые даты (21.11.2010, 20.11.2010 и 18.11.2010) нет никаких событий. Несмотря на их отсутствие, даты успешно выводятся. Из чего выходит, что пользователь видит события за 4 дня, вместо положенных восьми. Вот здесь я зашел в тупик...

Задача подразумевает вывод обновлений на 8 дней. Восемь дней не обязательно должны быть последовательными. Иначе говоря, если вчера и позавчера на сайте ничего не произошло - эти дни не засчитываем. Выводит только те даты, на которые есть какие-либо события.

Перед циклом foreach я вывожу дату. К примеру, Сегодня, 25 ноября 2010. НО: на этот день может и не быть никаких событий. А могут и быть, но после того, как пользователь вошел на сайт. К примеру, пользователь вошел сегодня, в 2 часа ночи. Между 25.11.2010, 00:00:00 и 25.11.2010, 02:00:00 нет событий. Первое событие может произойти позже - скажем, в 16:20 зарегистрируется новый пользователь. Это событие в 16:20 успешно выйдет на соответствующей странице с выводом событий на сайте.

У меня же, после 25.11.2010, 00:00:00 надпись "Сегодня, 25 ноября 2010" успешно выводится, несмотря на то, что на сегодня никаких событий... 

Никак не могу решить задачу с выводом дат:

Необходимо в самом начале проверять, есть ли на текущую дату какие-либо события (в массиве $new)? Если есть - выводим текущую дату и имеющиеся на текущую дату события. Затем проверяем предыдущий день - если нет событий, пропускаем дату. Проверяем очередную - по убыванию и т.д. Выводим только те даты, на которые произошли какие-либо события на сайте. В итоге, получится 8 дней...

Своими силами, боюсь, эту задачу мне не осилить. Три дня мучаюсь и безрезультатно. Либо код изначально неверно составлен, отчего и трудности с выводом дат...

Произвел поиск по форуму - подобное, вроде, не обсуждалось.

Прошу прощения за чересчур длинное сообщение и заранее большое спасибо за любую помощь в решении задачи...

Это сообщение отредактировал(а) Valdo - 25.11.2010, 23:44
PM MAIL   Вверх
skyboy
Дата 26.11.2010, 00:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



не $i <= $config['news_days'], а $j<= $config['news_days']
а $j увеличивать не в голове цикла уже, а в теле - только при условии, что в указанный день были события.
впрочем, мне кажется, что тебе надо поторопиться перейти от насилования массива к запросу из базы данных - пока данных немного.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1069 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.