Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] W jaki sposób wykonać takie zapytanie?
Forum PHP.pl > Forum > Przedszkole
świeżak
Witam,

Mam pewien problem odnośnie zapytania do bazy. Chciałbym wyciągnąć wszystkich użytkowników którzy byli online w ciągu 5 ostatnich minut.

Więc tak:
W bazie danych mam pole ostatnioOnline gdzie dane zapisywane są w formacie date('Y-m-d H:i:s');


Aby obliczyć ostatnie 5 minut robię to w taki sposób:

Kod
<?php
$ostatnioOnline=strtotime('2011-2-23 11:40:17');
$teraz=time();

$roznicawminutach = round(abs($teraz - $ostatnioOnline) / 60);

if($roznicawminutach >= 0 AND $roznicawminutach <= 5) {
echo 'online';
}
else {
echo 'offline';
}

?>


Chciałbym to jakoś teraz wrzucić do zapytania, tak aby wyciągało mi wszystkich którzy byli ostatnio online w ciągu 5 minut

Czy da się takie coś zrobić? Czy muszę jakoś przebudować bazę?
matiz123
Witaj!

Mam nadzieje że to Ci pomoże:

  1. <?php
  2. session_start(); // rozpoczynamy nową sesje
  3. $ID = session_id(); // przypisujemy $ID id sesji
  4. $czas = time(); // aktualny czas
  5. $do_zapisania="$ID:$czas"; // sposób w jaki zapisujemy aktualnie znajdującą się osobę na stronie: "id sesji":"czas w sekundach"
  6. $min_czas=300; // czas przez jaki zapisane jest wejście danej osoby
  7. $plik2="online"; // plik w którym są zapisywane osoby aktualnie przeglądające naszą stronie - ostatnie 5 minut
  8. $nowa=false; // ustala domyślną zmienną która oznacza że nie będzie nowego wpisu
  9.  
  10. $odczyt = fopen($plik2, "r"); // otwiera plik tylko do odczytu
  11. $users = fread($odczyt, filesize($plik2)); // odczytuje plik
  12. fclose($odczyt); // zamyka plik
  13.  
  14. if ($users=="") // sprawdzenie czy jest już jakiś wpis w pliku "online", jeśli nie to dodaje wpis: "$ID:$dzis_data"
  15. {
  16. $ile=1;
  17. $save=$do_zapisania;
  18. }
  19. else // w innym przypadku sprawdza istniejące wpisy
  20. {
  21. $uzytkownik=explode("\n", $users);
  22. while (list($key,$value)=each($uzytkownik))
  23. {
  24. list($old_id, $old_time) = explode(":",$value); // przypisywanie listy zmiennych
  25. if ($old_id!=$ID) // jeżeli istniejący id się różni od aktualnie sprawdzanego id
  26. {
  27. if ($czas-$old_time < $min_czas)
  28. {
  29. $new[]=$old_id.":".$old_time; // przypisanie zmiennej $new[] która jest tablicą id sesji starych danych
  30. }
  31. }
  32. else
  33. {
  34. $new[]=$do_zapisania; // przypisanie zmiennej $new[] która jest tablicą id sesji $ID:$dzis_data
  35. $nowa=true; // zezwolenie na dodanie nowego wpisu
  36. }
  37. }
  38. if ($nowa==false) // jeżeli nie ma nowego wpisu
  39. {
  40. $new[]=$do_zapisania; // przypisanie zmiennej $new[] która jest tablicą id sesji $ID:$dzis_data
  41. }
  42. $ile=count($new); // zliczenie ilości wpisów, które oznaczają ilość osób aktualnie znajdujących się na naszej stronie
  43. $save=implode("\n",$new); // przygotowanie nowego wpisu który zostane dodany w nowej linii
  44. }
  45.  
  46. $zapisz_plik = fopen($plik2, "w"); // otwieranie pliku do zapisu
  47. fwrite($zapisz_plik, $save); // zapis pliku z nowymi wartościami
  48. fclose($zapisz_plik); // zamknięcie pliki
  49.  
  50. <font face=Arial color=blue size=3>Na stronie przebywa:</font><font face=Arial color=red size=3> <b>'.$ile.'</b> Online</font>
  51. <br><br>
  52. ?>
świeżak
Raczej takie rozwiązanie mi nie pomoże, ponieważ chcę to zrobić z wykorzystaniem Mysql. W bazie przetrzymuję wszystkie dane, a w wyszukiwarce chce aby była możliwośc wyszukiwania użytkowników tych którzy byli zalogowani 5 minut wcześniej. Czyli użytkowników online.

Pole ostatnioOnline, jest aktualizowane co 5 minut jest sprawdzane i w przypadku gdy użytkownik wykonuje jakąś czynność na stronie, ten czas jest akutalizowany na czas teraźniejszy.


A ja szukam rozwiązania którym prosto z bazy danych w jednym zapytaniu mógłbym te dane wyciągnać przeglądam manuala i widzę :

Kod
mysql> SELECT TIMESTAMPDIFF(MINUTE,'2003-02-01','2003-05-01 12:05:55');
        -> 128885


Kod
mysql> SELECT TO_SECONDS('2009-11-29 13:43:32');
        -> 63426721412


Ale niestety u mnie to nie działa... więc pewnie robię coś nie tak. U mnie pole ostatnioOnline to VARCHAR i chyba tutaj też jest problem...
askone
Skoro chcesz to zrobić w mysql to poczytaj o funkcji DATE_ADD. Aby uzyskać oczekiwany efekt powinieneś w klauzuli WHERE umieścić coś w stylu:
  1. WHERE DATE_ADD(OstatnioOnline INTREVAL MINUTES 5) >= Now()


Pozdrawiam
świeżak
Cytat(askone @ 23.02.2011, 12:27:45 ) *
Skoro chcesz to zrobić w mysql to poczytaj o funkcji DATE_ADD. Aby uzyskać oczekiwany efekt powinieneś w klauzuli WHERE umieścić coś w stylu:
  1. WHERE DATE_ADD(OstatnioOnline INTREVAL MINUTES 5) >= Now()


Pozdrawiam


Dzięki , zabieram się do pracy.


No i się udało zapytanie wygląda w taki sposób:

Kod
WHERE DATE_ADD(ostatnioOnline, INTERVAL 5 MINUTE)  >= Now()


Bardzo dziękuję za pomoc smile.gif
Valdi_B
A może (moim zdaniem) "bardziej naturalny" zapis:
SELECT * FROM ... WHERE ostatnioOnline > date_sub(now(), INTERVAL 5 MINUTE)

1. Od teraz odejmujesz 5 minut - próg czasowy.
2. Szukasz rekordów gdzie ostatnioOnline jest "po" tym progu.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.