powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
25 сообщений из 58, страница 1 из 3
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343001
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите реализовать такую штуку

Есть три таблицы t1 t2 t3 структура разная но вот эти ячейки одинаковые id|data|name
Я понимаю что нужно сделать выборку за последние 24 часа.

Хочу сделать так:
1мин. назад Вася создал запись
10 мин. назад Коля выколупал казявку из носа
3 часа назад Петя ткнул пальцем в ...

Как это можно сделать?
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343075
JustCrazy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Маша и,
тыц
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343283
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JustCrazy,

Спасибо, но это не совсем то, дело не в мульти-запросе, а в
этой штуке

допустим запрос типа такой
select *
f
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
rom t.1, t.2, t.3 
WHERE data>= DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY)
if(mysql_num_rows($res) > 0)
		{ 
             while ($row = mysql_fetch_assoc($res))
               {
              $row['id'] = $row['id'];
              $row['data'] = FuncDate($valdate);// $row['data']-дата создания записи, переменная $date - в формате msql unix (2007-11-30 10:30:19)
              $row['name'] = $row['name'];
              $top .= parseTpl($tpl, $row);
               } 
       }


у меня есть функция, но она считает от текущей даты, а мне нужно тоже самое только от даты создания - $row['data']
функция выглядит так
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
  function HumanDatePrecise($date) {
    $r = false;
    $a = preg_split("/[:\.\s-]+/", $date);
    $d = time() - strtotime($date);
    if ($d > 0) {
      if ($d < 3600) {
//минут назад
        switch (floor($d / 60)) {
          case 0:
          case 1:
            return "<acronym title='$date'>только что</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>только что</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>три минуты назад</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>четыре минуты назад</acronym>";
            break;
          case 5:
            return "<acronym title='$date'>пять минут минуты назад</acronym>";
            break;
          default:
            return "<acronym title='$date'>" . floor($d / 60) . ' мин. назад</acronym>';
            break;
        };
      } elseif ($d < 18000) {
//часов назад
        switch (floor($d / 3600)) {
          case 1:
            return "<acronym title='$date'>час назад</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>два часа назад</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>три часа назад</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>четыре часа назад</acronym>";
            break;
        };
      } elseif ($d < 172800) {
//сегодня
//2011-07-14 16:20:44
// 0    1  2  3  4  5
        if (date('d') == $a[2]) {
          return "<acronym title='$date'>сегодня в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 86400) == $a[2]) {
          return "<acronym title='$date'>вчера в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 172800) == $a[2]) {
          return "<acronym title='$date'>позавчера в {$a[3]}:{$a[4]}</acronym>";
        }
      }
    } else {
////////////////////////////////////////////////////////////////////////////////////////
// В будущем   <editor-fold defaultstate="collapsed" desc="В будущем">
      $d *= - 1;
      if ($d < 3600) {
//минут назад
        switch (floor($d / 60)) {
          case 0:
          case 1:
            return "<acronym title='$date'>сейчас</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>через две минуты</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>через три минуты</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>через четыре минуты</acronym>";
            break;
          case 5:
            return "<acronym title='$date'>через пять минут</acronym>";
            break;
          default:
            return "<acronym title='$date'>через " . floor($d / 60) . ' мин.</acronym>';
            break;
        };
      } elseif ($d < 18000) {
//часов назад
        switch (floor($d / 3600)) {
          case 1:
            return "<acronym title='$date'>через час</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>через два часа</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>через три часа</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>через четыре часа</acronym>";
            break;
        };
      } elseif ($d < 172800) {
//сегодня
//2011-07-14 16:20:44
// 0    1  2  3  4  5
        if (date('d') == $a[2]) {
          return "<acronym title='$date'>сегодня в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 86400) == $a[2]) {
          return "<acronym title='$date'>завтра в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 172800) == $a[2]) {
          return "<acronym title='$date'>послезавтра в {$a[3]}:{$a[4]}</acronym>";
        }
      }
      $d *= - 1;
//, В будущем   </editor-fold>
////////////////////////////////////////////////////////////////////////////////////////.
    }

    $r = "{$a[2]}.{$a[1]}";
    if ($a[0] != date('Y') OR $d > 0) {
      $r .= '.' . $a[0];
    }
    $r .= " {$a[3]}:{$a[4]}";
    $date.= ', ' . self::$weekdays[(int) date('N', strtotime($date))];
    return "<acronym title='$date'>$r</acronym>";
  } 



как её переделать и прикрутить к запросам, не понимаю, помогите спасите :)
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343286
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маша и,

Код: plsql
1.
2.
3.
4.
5.
6.
(SELECT id, data, name FROM t1 WHERE DATEDIFF(HOUR, data, NOW())) 
UNION 
(SELECT id, data, name FROM t2 WHERE DATEDIFF(HOUR, data, NOW())) 
UNION 
(SELECT id, data, name FROM t3 WHERE DATEDIFF(HOUR, data, NOW())) 
ORDER by data desc



Нету на чём проверить, но если нигде не ошибся, то так. А эти "10мин назад" и всё такое лучше уже посчитать в PHP а не в mysql.

JustCrazy, ссылка не имеет никакого отношения к задаче. Там таблицы "в ширину" склеивают, а тут надо взять все строки с первой, второй и третьей и потом их слепить в одну выборку. Так что тут UNION :)
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343297
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПрограмёрМаша и,

Код: plsql
1.
2.
3.
4.
5.
6.
(SELECT id, data, name FROM t1 WHERE DATEDIFF(HOUR, data, NOW())) 
UNION 
(SELECT id, data, name FROM t2 WHERE DATEDIFF(HOUR, data, NOW())) 
UNION 
(SELECT id, data, name FROM t3 WHERE DATEDIFF(HOUR, data, NOW())) 
ORDER by data desc



Нету на чём проверить, но если нигде не ошибся, то так. А эти "10мин назад" и всё такое лучше уже посчитать в PHP а не в mysql.

JustCrazy, ссылка не имеет никакого отношения к задаче. Там таблицы "в ширину" склеивают, а тут надо взять все строки с первой, второй и третьей и потом их слепить в одну выборку. Так что тут UNION :)

ок, так вопрос мой как раз в том как сделать "10мин назад", помогите подскажите :)
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343404
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маша иJustCrazy,

Спасибо, но это не совсем то, дело не в мульти-запросе, а в
этой штуке

допустим запрос типа такой
select *
f
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
rom t.1, t.2, t.3 
WHERE data>= DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY)
if(mysql_num_rows($res) > 0)
		{ 
             while ($row = mysql_fetch_assoc($res))
               {
              $row['id'] = $row['id'];
              $row['data'] = FuncDate($valdate);// $row['data']-дата создания записи, переменная $date - в формате msql unix (2007-11-30 10:30:19)
              $row['name'] = $row['name'];
              $top .= parseTpl($tpl, $row);
               } 
       }


у меня есть функция, но она считает от текущей даты, а мне нужно тоже самое только от даты создания - $row['data']
функция выглядит так
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
  function HumanDatePrecise($date) {
    $r = false;
    $a = preg_split("/[:\.\s-]+/", $date);
    $d = time() - strtotime($date);
    if ($d > 0) {
      if ($d < 3600) {
//минут назад
        switch (floor($d / 60)) {
          case 0:
          case 1:
            return "<acronym title='$date'>только что</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>только что</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>три минуты назад</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>четыре минуты назад</acronym>";
            break;
          case 5:
            return "<acronym title='$date'>пять минут минуты назад</acronym>";
            break;
          default:
            return "<acronym title='$date'>" . floor($d / 60) . ' мин. назад</acronym>';
            break;
        };
      } elseif ($d < 18000) {
//часов назад
        switch (floor($d / 3600)) {
          case 1:
            return "<acronym title='$date'>час назад</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>два часа назад</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>три часа назад</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>четыре часа назад</acronym>";
            break;
        };
      } elseif ($d < 172800) {
//сегодня
//2011-07-14 16:20:44
// 0    1  2  3  4  5
        if (date('d') == $a[2]) {
          return "<acronym title='$date'>сегодня в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 86400) == $a[2]) {
          return "<acronym title='$date'>вчера в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 172800) == $a[2]) {
          return "<acronym title='$date'>позавчера в {$a[3]}:{$a[4]}</acronym>";
        }
      }
    } else {
////////////////////////////////////////////////////////////////////////////////////////
// В будущем   <editor-fold defaultstate="collapsed" desc="В будущем">
      $d *= - 1;
      if ($d < 3600) {
//минут назад
        switch (floor($d / 60)) {
          case 0:
          case 1:
            return "<acronym title='$date'>сейчас</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>через две минуты</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>через три минуты</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>через четыре минуты</acronym>";
            break;
          case 5:
            return "<acronym title='$date'>через пять минут</acronym>";
            break;
          default:
            return "<acronym title='$date'>через " . floor($d / 60) . ' мин.</acronym>';
            break;
        };
      } elseif ($d < 18000) {
//часов назад
        switch (floor($d / 3600)) {
          case 1:
            return "<acronym title='$date'>через час</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>через два часа</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>через три часа</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>через четыре часа</acronym>";
            break;
        };
      } elseif ($d < 172800) {
//сегодня
//2011-07-14 16:20:44
// 0    1  2  3  4  5
        if (date('d') == $a[2]) {
          return "<acronym title='$date'>сегодня в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 86400) == $a[2]) {
          return "<acronym title='$date'>завтра в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 172800) == $a[2]) {
          return "<acronym title='$date'>послезавтра в {$a[3]}:{$a[4]}</acronym>";
        }
      }
      $d *= - 1;
//, В будущем   </editor-fold>
////////////////////////////////////////////////////////////////////////////////////////.
    }

    $r = "{$a[2]}.{$a[1]}";
    if ($a[0] != date('Y') OR $d > 0) {
      $r .= '.' . $a[0];
    }
    $r .= " {$a[3]}:{$a[4]}";
    $date.= ', ' . self::$weekdays[(int) date('N', strtotime($date))];
    return "<acronym title='$date'>$r</acronym>";
  } 



как её переделать и прикрутить к запросам, не понимаю, помогите спасите :)


Ну нифига себе наворотили

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
function padezh($num, $p1, $p2, $p5){
  $x = $num % 100;
  $y = ($x % 10)-1;
  $res = ($x/10)>>0==1 ? $p5 : ($y&12 ? $p5 : ($y&3 ? $p2 : $p1));
  return $res;
}

function dateDiff($d, $now = null){
  if ($now===null) $now = date("Y-m-d H:i:s");
  $snow = strtotime($now);
  $sd = strtotime($d);
  $seconds = $snow-$sd;
  $aseconds = abs($seconds);
  if ($aseconds<120){
    return ($seconds<0 ? "Только что" : "Сейчас");
  }
  elseif($aseconds<3600){
    return ($seconds<0 ? "через " : "").(round($aseconds / 60) % 60)." ".padezh(round($aseconds / 60) % 60, "минуту", "минуты", "минут").($seconds>0 ? " назад" : "");
  }
  elseif($aseconds<18000){
    return ($seconds<0 ? "через " : "").(round($aseconds / 3600) % 24)." ".padezh(round($aseconds / 3600) % 24, "час", "часа", "часов").($seconds>0 ? " назад" : "");
  }
  elseif(($days = abs(strtotime(date("Y-m-d", $sd))-strtotime(date("Y-m-d", $snow)))/3600/24 >> 0)<3){
    if ($seconds>=0){
      switch($days){
        case 0: return "сегодня в ".date("H:i", $sd); break;
        case 1: return "вчера в ".date("H:i", $sd); break;
        case 2: return "позавчера в ".date("H:i", $sd); break;
      }
    }
    else{
      switch($days){
        case 0: return "сегодня в ".date("H:i", $sd); break;
        case 1: return "завтра в ".date("H:i", $sd); break;
        case 2: return "послезавтра в ".date("H:i", $sd); break;
      }
    }
  }
  else{
    return date("Y-m-d H:i", $sd);
  }
}



Погонять по всем вариантам не могу (времени мало), но вроде работает на опробованных.
Ввёл округление, что бы "час 58 минут" не считалось как "1 час", а считалось как "2 часа".
Слова "один", "два", "три" заменил на цифры, что бы не усложнять.
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343432
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Програмёр
Маша иJustCrazy,

Спасибо, но это не совсем то, дело не в мульти-запросе, а в
этой штуке

допустим запрос типа такой
select *
f
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
rom t.1, t.2, t.3 
WHERE data>= DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY)
if(mysql_num_rows($res) > 0)
		{ 
             while ($row = mysql_fetch_assoc($res))
               {
              $row['id'] = $row['id'];
              $row['data'] = FuncDate($valdate);// $row['data']-дата создания записи, переменная $date - в формате msql unix (2007-11-30 10:30:19)
              $row['name'] = $row['name'];
              $top .= parseTpl($tpl, $row);
               } 
       }


у меня есть функция, но она считает от текущей даты, а мне нужно тоже самое только от даты создания - $row['data']
функция выглядит так
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
  function HumanDatePrecise($date) {
    $r = false;
    $a = preg_split("/[:\.\s-]+/", $date);
    $d = time() - strtotime($date);
    if ($d > 0) {
      if ($d < 3600) {
//минут назад
        switch (floor($d / 60)) {
          case 0:
          case 1:
            return "<acronym title='$date'>только что</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>только что</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>три минуты назад</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>четыре минуты назад</acronym>";
            break;
          case 5:
            return "<acronym title='$date'>пять минут минуты назад</acronym>";
            break;
          default:
            return "<acronym title='$date'>" . floor($d / 60) . ' мин. назад</acronym>';
            break;
        };
      } elseif ($d < 18000) {
//часов назад
        switch (floor($d / 3600)) {
          case 1:
            return "<acronym title='$date'>час назад</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>два часа назад</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>три часа назад</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>четыре часа назад</acronym>";
            break;
        };
      } elseif ($d < 172800) {
//сегодня
//2011-07-14 16:20:44
// 0    1  2  3  4  5
        if (date('d') == $a[2]) {
          return "<acronym title='$date'>сегодня в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 86400) == $a[2]) {
          return "<acronym title='$date'>вчера в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 172800) == $a[2]) {
          return "<acronym title='$date'>позавчера в {$a[3]}:{$a[4]}</acronym>";
        }
      }
    } else {
////////////////////////////////////////////////////////////////////////////////////////
// В будущем   <editor-fold defaultstate="collapsed" desc="В будущем">
      $d *= - 1;
      if ($d < 3600) {
//минут назад
        switch (floor($d / 60)) {
          case 0:
          case 1:
            return "<acronym title='$date'>сейчас</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>через две минуты</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>через три минуты</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>через четыре минуты</acronym>";
            break;
          case 5:
            return "<acronym title='$date'>через пять минут</acronym>";
            break;
          default:
            return "<acronym title='$date'>через " . floor($d / 60) . ' мин.</acronym>';
            break;
        };
      } elseif ($d < 18000) {
//часов назад
        switch (floor($d / 3600)) {
          case 1:
            return "<acronym title='$date'>через час</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>через два часа</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>через три часа</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>через четыре часа</acronym>";
            break;
        };
      } elseif ($d < 172800) {
//сегодня
//2011-07-14 16:20:44
// 0    1  2  3  4  5
        if (date('d') == $a[2]) {
          return "<acronym title='$date'>сегодня в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 86400) == $a[2]) {
          return "<acronym title='$date'>завтра в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 172800) == $a[2]) {
          return "<acronym title='$date'>послезавтра в {$a[3]}:{$a[4]}</acronym>";
        }
      }
      $d *= - 1;
//, В будущем   </editor-fold>
////////////////////////////////////////////////////////////////////////////////////////.
    }

    $r = "{$a[2]}.{$a[1]}";
    if ($a[0] != date('Y') OR $d > 0) {
      $r .= '.' . $a[0];
    }
    $r .= " {$a[3]}:{$a[4]}";
    $date.= ', ' . self::$weekdays[(int) date('N', strtotime($date))];
    return "<acronym title='$date'>$r</acronym>";
  } 



как её переделать и прикрутить к запросам, не понимаю, помогите спасите :)


Ну нифига себе наворотили

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
function padezh($num, $p1, $p2, $p5){
  $x = $num % 100;
  $y = ($x % 10)-1;
  $res = ($x/10)>>0==1 ? $p5 : ($y&12 ? $p5 : ($y&3 ? $p2 : $p1));
  return $res;
}

function dateDiff($d, $now = null){
  if ($now===null) $now = date("Y-m-d H:i:s");
  $snow = strtotime($now);
  $sd = strtotime($d);
  $seconds = $snow-$sd;
  $aseconds = abs($seconds);
  if ($aseconds<120){
    return ($seconds<0 ? "Только что" : "Сейчас");
  }
  elseif($aseconds<3600){
    return ($seconds<0 ? "через " : "").(round($aseconds / 60) % 60)." ".padezh(round($aseconds / 60) % 60, "минуту", "минуты", "минут").($seconds>0 ? " назад" : "");
  }
  elseif($aseconds<18000){
    return ($seconds<0 ? "через " : "").(round($aseconds / 3600) % 24)." ".padezh(round($aseconds / 3600) % 24, "час", "часа", "часов").($seconds>0 ? " назад" : "");
  }
  elseif(($days = abs(strtotime(date("Y-m-d", $sd))-strtotime(date("Y-m-d", $snow)))/3600/24 >> 0)<3){
    if ($seconds>=0){
      switch($days){
        case 0: return "сегодня в ".date("H:i", $sd); break;
        case 1: return "вчера в ".date("H:i", $sd); break;
        case 2: return "позавчера в ".date("H:i", $sd); break;
      }
    }
    else{
      switch($days){
        case 0: return "сегодня в ".date("H:i", $sd); break;
        case 1: return "завтра в ".date("H:i", $sd); break;
        case 2: return "послезавтра в ".date("H:i", $sd); break;
      }
    }
  }
  else{
    return date("Y-m-d H:i", $sd);
  }
}



Погонять по всем вариантам не могу (времени мало), но вроде работает на опробованных.
Ввёл округление, что бы "час 58 минут" не считалось как "1 час", а считалось как "2 часа".
Слова "один", "два", "три" заменил на цифры, что бы не усложнять.

Супер-пупер, вечером опробую, о результате доложу! Спасибо!
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343529
DateTime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор что бы не усложнять.
Код: php
1.
2.
3.
4.
5.
        $date = \DateTime::createFromFormat('Y/m/d H:i:s', '2013/07/25 00:00:00'); 
        //$date = new \DateTime("@1171502725"); from UNIX timestamp!!!
        $now = new \DateTime();
        $interval = $now->diff($date);
        var_dump($interval);


и погнали...
Код: php
1.
2.
3.
4.
5.
6.
$interval->y;
$interval->m;
$interval->d;
$interval->h;
$interval->i;
$interval->s;


почитать http://www.php.net/manual/ru/class.datetime.php#datetime.constants.atom
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343558
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DateTimeавтор что бы не усложнять.
Код: php
1.
2.
3.
4.
5.
        $date = \DateTime::createFromFormat('Y/m/d H:i:s', '2013/07/25 00:00:00'); 
        //$date = new \DateTime("@1171502725"); from UNIX timestamp!!!
        $now = new \DateTime();
        $interval = $now->diff($date);
        var_dump($interval);


и погнали...
Код: php
1.
2.
3.
4.
5.
6.
$interval->y;
$interval->m;
$interval->d;
$interval->h;
$interval->i;
$interval->s;


почитать http://www.php.net/manual/ru/class.datetime.php#datetime.constants.atom

и? :) Напишите работающий вариант, сравним.
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343580
DateTime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторНапишите работающий вариант, сравним.
что там сравнивать?! банальные операции if else ?
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343602
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DateTimeавторНапишите работающий вариант, сравним.
что там сравнивать?! банальные операции if else ?

а я считаю что есть. Вы пишите "что бы не усложнять" и даёте данную функцию, намекая, что с ней будет легче написать то, что надо. Однако не пишите результирующий код. Заметьте, у меня тоже банальные if else и switch..case. Я предлагаю Вам написать конечный код, что бы сравнить какой вариант менее усложнённый.
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343615
DateTime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор Я предлагаю Вам написать конечный код
автори? :)
будет время и необходимость - напишу обязательно!
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343622
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DateTimeавтор Я предлагаю Вам написать конечный код
автори? :)
будет время и необходимость - напишу обязательно!
Да-да напишите, очень интересно увидеть и другие варианты.
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343630
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
return (($number % 10 == 1) && ($number % 100 != 11)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2);


вот вам код для слонения числительных.
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343647
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Маша иПрограмёр
Маша иJustCrazy,

Спасибо, но это не совсем то, дело не в мульти-запросе, а в
этой штуке

допустим запрос типа такой
select *
f
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
rom t.1, t.2, t.3 
WHERE data>= DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY)
if(mysql_num_rows($res) > 0)
		{ 
             while ($row = mysql_fetch_assoc($res))
               {
              $row['id'] = $row['id'];
              $row['data'] = FuncDate($valdate);// $row['data']-дата создания записи, переменная $date - в формате msql unix (2007-11-30 10:30:19)
              $row['name'] = $row['name'];
              $top .= parseTpl($tpl, $row);
               } 
       }


у меня есть функция, но она считает от текущей даты, а мне нужно тоже самое только от даты создания - $row['data']
функция выглядит так
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
  function HumanDatePrecise($date) {
    $r = false;
    $a = preg_split("/[:\.\s-]+/", $date);
    $d = time() - strtotime($date);
    if ($d > 0) {
      if ($d < 3600) {
//минут назад
        switch (floor($d / 60)) {
          case 0:
          case 1:
            return "<acronym title='$date'>только что</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>только что</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>три минуты назад</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>четыре минуты назад</acronym>";
            break;
          case 5:
            return "<acronym title='$date'>пять минут минуты назад</acronym>";
            break;
          default:
            return "<acronym title='$date'>" . floor($d / 60) . ' мин. назад</acronym>';
            break;
        };
      } elseif ($d < 18000) {
//часов назад
        switch (floor($d / 3600)) {
          case 1:
            return "<acronym title='$date'>час назад</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>два часа назад</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>три часа назад</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>четыре часа назад</acronym>";
            break;
        };
      } elseif ($d < 172800) {
//сегодня
//2011-07-14 16:20:44
// 0    1  2  3  4  5
        if (date('d') == $a[2]) {
          return "<acronym title='$date'>сегодня в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 86400) == $a[2]) {
          return "<acronym title='$date'>вчера в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 172800) == $a[2]) {
          return "<acronym title='$date'>позавчера в {$a[3]}:{$a[4]}</acronym>";
        }
      }
    } else {
////////////////////////////////////////////////////////////////////////////////////////
// В будущем   <editor-fold defaultstate="collapsed" desc="В будущем">
      $d *= - 1;
      if ($d < 3600) {
//минут назад
        switch (floor($d / 60)) {
          case 0:
          case 1:
            return "<acronym title='$date'>сейчас</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>через две минуты</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>через три минуты</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>через четыре минуты</acronym>";
            break;
          case 5:
            return "<acronym title='$date'>через пять минут</acronym>";
            break;
          default:
            return "<acronym title='$date'>через " . floor($d / 60) . ' мин.</acronym>';
            break;
        };
      } elseif ($d < 18000) {
//часов назад
        switch (floor($d / 3600)) {
          case 1:
            return "<acronym title='$date'>через час</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>через два часа</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>через три часа</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>через четыре часа</acronym>";
            break;
        };
      } elseif ($d < 172800) {
//сегодня
//2011-07-14 16:20:44
// 0    1  2  3  4  5
        if (date('d') == $a[2]) {
          return "<acronym title='$date'>сегодня в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 86400) == $a[2]) {
          return "<acronym title='$date'>завтра в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 172800) == $a[2]) {
          return "<acronym title='$date'>послезавтра в {$a[3]}:{$a[4]}</acronym>";
        }
      }
      $d *= - 1;
//, В будущем   </editor-fold>
////////////////////////////////////////////////////////////////////////////////////////.
    }

    $r = "{$a[2]}.{$a[1]}";
    if ($a[0] != date('Y') OR $d > 0) {
      $r .= '.' . $a[0];
    }
    $r .= " {$a[3]}:{$a[4]}";
    $date.= ', ' . self::$weekdays[(int) date('N', strtotime($date))];
    return "<acronym title='$date'>$r</acronym>";
  } 



как её переделать и прикрутить к запросам, не понимаю, помогите спасите :)


Ну нифига себе наворотили

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
function padezh($num, $p1, $p2, $p5){
  $x = $num % 100;
  $y = ($x % 10)-1;
  $res = ($x/10)>>0==1 ? $p5 : ($y&12 ? $p5 : ($y&3 ? $p2 : $p1));
  return $res;
}

function dateDiff($d, $now = null){
  if ($now===null) $now = date("Y-m-d H:i:s");
  $snow = strtotime($now);
  $sd = strtotime($d);
  $seconds = $snow-$sd;
  $aseconds = abs($seconds);
  if ($aseconds<120){
    return ($seconds<0 ? "Только что" : "Сейчас");
  }
  elseif($aseconds<3600){
    return ($seconds<0 ? "через " : "").(round($aseconds / 60) % 60)." ".padezh(round($aseconds / 60) % 60, "минуту", "минуты", "минут").($seconds>0 ? " назад" : "");
  }
  elseif($aseconds<18000){
    return ($seconds<0 ? "через " : "").(round($aseconds / 3600) % 24)." ".padezh(round($aseconds / 3600) % 24, "час", "часа", "часов").($seconds>0 ? " назад" : "");
  }
  elseif(($days = abs(strtotime(date("Y-m-d", $sd))-strtotime(date("Y-m-d", $snow)))/3600/24 >> 0)<3){
    if ($seconds>=0){
      switch($days){
        case 0: return "сегодня в ".date("H:i", $sd); break;
        case 1: return "вчера в ".date("H:i", $sd); break;
        case 2: return "позавчера в ".date("H:i", $sd); break;
      }
    }
    else{
      switch($days){
        case 0: return "сегодня в ".date("H:i", $sd); break;
        case 1: return "завтра в ".date("H:i", $sd); break;
        case 2: return "послезавтра в ".date("H:i", $sd); break;
      }
    }
  }
  else{
    return date("Y-m-d H:i", $sd);
  }
}



Погонять по всем вариантам не могу (времени мало), но вроде работает на опробованных.
Ввёл округление, что бы "час 58 минут" не считалось как "1 час", а считалось как "2 часа".
Слова "один", "два", "три" заменил на цифры, что бы не усложнять.

Супер-пупер, вечером опробую, о результате доложу! Спасибо!

А как обрабатывать вашей функцией результат?
Вот запрос, а как обработать помогите пожалуйста новичку?
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
$res = mysqlQuery("SELECT `id`, `date`, `name` 
                           FROM `user`  
                           WHERE `date` >= DATE_SUB(CURRENT_DATE, INTERVAL 400 DAY) ORDER BY `date` DESC");
if(mysql_num_rows($res) > 0)
		{ 
             while ($row = mysql_fetch_assoc($res))
               {
              $row['id'] = $row['id'];
              $row['date'] = $row['date'];// вот тут дата создания записи, наверное с ней нужно делать манипуляции?
              $row['name'] = $row['name'];
              $top .= parseTpl($tpl, $row);
               } 
       }
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343662
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маша и,

Код: php
1.
$row["data"]=dateDiff($row["data"]);



после выполнения в $row["data"] будет лежать нужное значение (относительно сейчас, если надо с другой датой сравнить, в функции предусмотрен второй аргумент).
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343666
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрМаша и,

Код: php
1.
$row["data"]=dateDiff($row["data"]);



после выполнения в $row["data"] будет лежать нужное значение (относительно сейчас, если надо с другой датой сравнить, в функции предусмотрен второй аргумент).

hot fix:
Код: php
1.
$row["date"]=dateDiff($row["date"]);


в первом сообщении было $row["data"], не заметил, что в последнем уже "date" :)
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343684
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПрограмёрПрограмёрМаша и,

Код: php
1.
$row["data"]=dateDiff($row["data"]);



после выполнения в $row["data"] будет лежать нужное значение (относительно сейчас, если надо с другой датой сравнить, в функции предусмотрен второй аргумент).

hot fix:
Код: php
1.
$row["date"]=dateDiff($row["date"]);


в первом сообщении было $row["data"], не заметил, что в последнем уже "date" :)

Да, да это есть, я на почту вам, там и адрес сайта и т.д.
Оно просто дату из БД выводит и всё, странно... почему?
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343704
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маша и,

Ваш сайтик лежит :) так что там ничего не видно... А Вы бы лучше сюда ссылочку скинули (если конечно не стараетесь её в секрете сохранить), может ещё кто-нить что-то дельное подскажет.
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343712
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПрограмёрМаша и,

Ваш сайтик лежит :) так что там ничего не видно... А Вы бы лучше сюда ссылочку скинули (если конечно не стараетесь её в секрете сохранить), может ещё кто-нить что-то дельное подскажет.

так вот задача лежит из-за падежа, Fatal error: Cannot redeclare padezh() (previously declared in
показывает ошибку в этой строчке function padezh($num, $p1, $p2, $p5){
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343736
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маша иПрограмёрМаша и,

Ваш сайтик лежит :) так что там ничего не видно... А Вы бы лучше сюда ссылочку скинули (если конечно не стараетесь её в секрете сохранить), может ещё кто-нить что-то дельное подскажет.

так вот задача лежит из-за падежа, Fatal error: Cannot redeclare padezh() (previously declared in
показывает ошибку в этой строчке function padezh($num, $p1, $p2, $p5){

Хм. Вам бы учебничек по пхп какой-нить почитать ;). Вообщем или у Вас в коде уже была объявлена функция padezh или Вы мою функцию по ошибке дважды объявили. Вы все padezh в моём коде замените например на padezh2 и если вы не продублировали данный код по ошибке несколько раз - будет Вам счастье.
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343753
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПрограмёрМаша ипропущено...


так вот задача лежит из-за падежа, Fatal error: Cannot redeclare padezh() (previously declared in
показывает ошибку в этой строчке function padezh($num, $p1, $p2, $p5){

Хм. Вам бы учебничек по пхп какой-нить почитать ;). Вообщем или у Вас в коде уже была объявлена функция padezh или Вы мою функцию по ошибке дважды объявили. Вы все padezh в моём коде замените например на padezh2 и если вы не продублировали данный код по ошибке несколько раз - будет Вам счастье.

Да два раза было подключено :) а теперь выводит просто дату из БД и всё :(
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343772
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПрограмёрМаша ипропущено...


так вот задача лежит из-за падежа, Fatal error: Cannot redeclare padezh() (previously declared in
показывает ошибку в этой строчке function padezh($num, $p1, $p2, $p5){

Хм. Вам бы учебничек по пхп какой-нить почитать ;). Вообщем или у Вас в коде уже была объявлена функция padezh или Вы мою функцию по ошибке дважды объявили. Вы все padezh в моём коде замените например на padezh2 и если вы не продублировали данный код по ошибке несколько раз - будет Вам счастье.

Ура!!!! Работает!!!! Спасибо!!!!!!!!!!!!!!!!!!!!!!!
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343774
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маша и,

ну вот... видите... разобрались. А выводило просто дату из-за того, что все действия были древние :)
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343791
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПрограмёрМаша и,

ну вот... видите... разобрались. А выводило просто дату из-за того, что все действия были древние :)

ага, я 400 дней поставила :)
Я так понимаю что в этой части кода периоды, а как их менять?
Код: php
1.
2.
3.
4.
5.
6.
7.
elseif($aseconds<3600){
    return ($seconds<0 ? "через " : "").(round($aseconds / 60) % 60)." ".padezh(round($aseconds / 60) % 60, "минуту", "минуты", "минут").($seconds>0 ? " назад" : "");
  }
  elseif($aseconds<18000){
    return ($seconds<0 ? "через " : "").(round($aseconds / 3600) % 24)." ".padezh(round($aseconds / 3600) % 24, "час", "часа", "часов").($seconds>0 ? " назад" : "");
  }
  elseif(($days = abs(strtotime(date("Y-m-d", $sd))-strtotime(date("Y-m-d", $snow)))/3600/24 >> 0)<3){
...
Рейтинг: 0 / 0
25 сообщений из 58, страница 1 из 3
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]