Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] W jaki sposób wykonać takie zapytanie?, Czy da się w ogóle to zrobić?
świeżak
post
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 12.02.2011

Ostrzeżenie: (0%)
-----


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ę?
Go to the top of the page
+Quote Post
matiz123
post
Post #2





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 22.02.2011

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
świeżak
post
Post #3





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 12.02.2011

Ostrzeżenie: (0%)
-----


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...

Ten post edytował świeżak 23.02.2011, 12:29:13
Go to the top of the page
+Quote Post
askone
post
Post #4





Grupa: Zarejestrowani
Postów: 654
Pomógł: 121
Dołączył: 27.10.2007
Skąd: Poznań, Łódź

Ostrzeżenie: (0%)
-----


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


--------------------
Kliknij jeśli moja odpowiedź Ci pomogła.
askone.pl
Go to the top of the page
+Quote Post
świeżak
post
Post #5





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 12.02.2011

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Valdi_B
post
Post #6





Grupa: Zarejestrowani
Postów: 107
Pomógł: 30
Dołączył: 19.02.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 12:28