Chciałem się Was zapytać, czy na mojej stronce dałoby by się zrobić wyświetlanie ikonki online kiedy dany użytkownik jest zalogowany na mojej stronie - a kiedy jest wylogowany to żeby była ikonka offline ? Takie coś chciałem zamieścić w liście użytkowników: http://www.history.is.net.pl/uzytkownicy
Moja strona posiada swoją baze danych. Czy ktoś mógłby mi takie coś pomóc zrobić na mojej stronce ? Bardzo byłbym wdzięczny.
Można to zrobić w np w taki sposób że do tabeli w bazie danych gdzie przechowujesz dane o użytkownikach dodajesz nowe pole online. Podczas logowania wrzucasz do tego pola aktualny czas+ np 10 minut, podczas generowania listy użytkowników sprawdzasz czy aktualny czas jest < niż wartość w bazie, jeśli tak to można przyjąć że użytkownik jest online (albo był w ciągu ostatnich 10 minut).
Do tego podczas przeglądania strony przez zalogowanego użytkownika czas trzeba uaktualniać wartość w bazie a o podczas wylogowania można go usunąć.
Rozumie, że chodzi Ci o to że w pliku użytkownicy.php w tabeli dodam sobie nowe pole cos podobnego do tego ponizej tak ?
<?php if ($uzytkownik['gg']) {
?><?php
}
?>[/code]
Musiałbym pewnie modyfikowac plik logowanie.php ale nie wiem jakby wygladal kod dodający tutaj do pola atualny czas:
[code]
» Logowanie
<?php if (zalogowany()) { ?> Jesteś zalogowany jako <?php echo _e($_SESSION[‘username’]); ?>. Kliknij tutaj aby edytować swój profil.<?php } else { ?> <?php if (isset($flash[‘komunikat’])) { ?> <?php echo $flash[‘komunikat’]; ?><?php } ?>
Nazwa użytkownika
Hasło
Zapamiętaj mnie
<?php } ?>
Nie wiem zabardzo jak to zrobić
Czy dałoby by się to zrobić bez ciągłej aktualności wartości tylko żeby to jakoś samo działało ?
Chcę, że w tabeli użytkownicy jak ktoś będzie online to żeby była ikonka taka:
A jak ktoś będzie na stronie offline, to żeby ikonka była taka:
W bazie danych, tam gdzie masz dane użytkowników, musisz dodać nowe pole o (dowolnej) nazwie np. czas , które to pole będzie zawierało czas (pełną datę i czas) ostatniej wizyty danego użytkownika na Twojej stronie. Jak zrobić taką modyfikację tabeli w SQLite musisz sobie poszukać np. w necie (chyba że wiesz jak to się robi): http://phpedia.pl/wiki/SQLite
ALTER TABLE uzytkownicy ADD czas INT NOT NULL DEFAULT 0;
Uwaga: SQLite nie posiada zaawansowanych typów danych takich jak data i czas, dlatego należy przyjąć jakąś swoją reprezentację tego czasu w bazie i potem napisać obsługę jego przetwarzania w PHP. Można datę i czas trzymać np. jako tekst albo jako liczbę (np. minut od określonej daty początkowej lub mikrosekund od początku ery uniksowej - takiej, jaką zwraca funkcja microtime() w PHP, ewentualnie zredukowana dla wygody do sekund lub minut), tylko potem trzeba odpowiednio rozwiązać porównywanie bieżącej daty i czasu w PHP.
Zastanów się, skąd Twój skrypt ma wiedzieć, czy dany użytkownik jest (jeszcze) na Twojej stronie? Jak sobie wejdzie na daną stronę www i pozostanie na niej kilka godzin nic na niej nie robiąc, to Ty nie rozpoznasz/nie rozróżnisz tego od sytuacji, w której po wejściu na tę stronę on zamknie po prostu przeglądarkę (nie będziesz miał informacji o wylogowaniu, bo nie kliknie na wyloguj).
Aby powyższe (z pkt. 2) móc kontrolować na bieżąco, musisz napisać dodatkowy kod, tzw. czujkę, która np. jako ukryta ramka (IFRAME) na Twojej stronie będzie co jakiś czas (np. co 1 minutę) wywoływała jakiś Twój specjalny skrypt zapisujący aktywność danego użytkownika w bazie (dane o użytkowniku weźmie z zapamiętanej w PHP sesji). Nie jest to trudne, a całkowicie rozwiązuje problem śledzenia na bieżąco użytkownika. Niestety taką ramkę (wstawkę) musisz umieszczać na każdej swojej stronie www - najlepiej jest to zakodować w osobnym pliku .php i wczytywać (funkcją include lub require) do każdego swojego skryptu (oczywiście we właściwym miejscu, bo to będzie dodatkowy kod HTML).
Mając w bazie powyższe, tj. datę i czas ostatniej wizyty danego użytkownika na stronie, w skrypcie wypisującym wszystkich użytkowników Twojego serwisu musisz sprawdzić, czy w ogóle jakaś data jest wpisana i porównywać ją z bieżącą - dodatkowo zakładając jakiś margines czasowy (1-10 minut) i wstawiać w wybranej kolumnie tabeli na stronie odpowiednią ikonkę aktywności użytkownika.
Jak widzisz, sprawa nie jest banalna i wymaga trochę dodatkowego pisania.
Poniżej masz przykłady realizacji Twojego problemu, zorientujesz się jak to inni zrobili:
W którym miejscu lub gdzie w tym pliku moge sobie dodać takie nowe pole i jak to zrobić ? Chciałbym żebyś mi pomógł to zrobić bo troche kiepsko się w tym orientuje.
Prosze Cię Bardzo byś mi pomógł.
Tutaj na forum jak zapewne zauważyłeś też jest taka opcja kiedy jest dany użytkownik online a kiedy offline. Chciałbym by podobnie działało to u mnie na stronce.
Troche nie zabardzo wiem jak to wszystko zrobić, czy miałbyś czas mi pomóc to zrobić prawidłowo tak żeby działało u mnie na stronie ?
Jak byś nie zauważył, druga z kolei tabela w pliku przechowuje użytkowników. Tam właśnie masz dodać to pole. Czy ty w ogóle rozumiesz co masz dotychczas zrobione ?
Czas aktualizujesz podczas wczytywania witryny, oraz za pomocą ajax’a wysyłając do serwera informację o korzystaniu z witryny co np minutę.
W phpbb aktywność zrobiona jest tak samo (po przeładowaniu zmieniany jest czas). Weź też pod uwagę sens twojego działania, ile można sprawdzać coś na stronie. O ile nie piszesz czatu / komunikatora / forum takie coś jest zupełnie zbędne. Nie zapomnij też że pomóc != zrobić.
Gwoli informacji: baza danych zawiera kilka tabel, w których są trzymane poszczególne dane. U Ciebie są to tabele newsy oraz uzytkownicy. W tej drugiej tabeli musisz dodać nową kolumnę przechowującą datę i czas ostatniej wizyty danego użytkownika.
– Dodane 09.01.2013 (Śr) 18:33 –
Jeśli zaś chodzi o skrypt, który będzie uaktualniał czas w tabeli uzytkownicy dla bieżącego (zalogowanego) użytkownika, to przetestuj ten skrypt:
<?php
session_start();
date_default_timezone_set('Europe/Warsaw');
$db = new PDO('sqlite:darom.sqlite');
if (isset($_SESSION['login'], $_SESSION['id']))
{
$q = $db->prepare('UPDATE uzytkownicy SET czas = DATETIME(\'NOW\') WHERE id = :id');
$q->bindValue(':id', $_SESSION['id'], PDO::PARAM_STR);
$q->execute();
}
?>
I sprawdź na zalogowanym użytkowniku (np. w drugiej zakładce tej samej przeglądarki), czy uruchomienie tego skryptu w przeglądarce będzie odświeżało pole czas w tabeli. Zakładam że dodałeś już pole o nazwie czas do tabeli uzytkownicy.
Ani tu, ani tu. Zapisz go w osobnym plik, np. status.php i w osobnej zakładce wejdź na stronę z nim i sprawdź, czy w bazie SQLite stosowne pole się uaktualniło (nie używałem bazy SQLite i nie mam pewności, czy co napisałem to zadziała).
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [14] unable to open database file' in /home/users/history/public_html/templates/status.php:4 Stack trace: #0 /home/users/history/public_html/templates/status.php(4): PDO->__construct('sqlite:darom.sq...') #1 {main} thrown in /home/users/history/public_html/templates/status.php on line 4
Zobacz u siebie w skryptach, jak wygląda podobna linia i popraw tę w tym skrypcie (pewnie inaczej wygląda ścieżka do bazy). EDIT: jak się zorientowałem szukając w necie, błąd jest spowodowany brakiem biblioteki związanej z sqlite, Ty masz w kodzie swoich skryptów (m.in. uzytkownicy.php) zapewne taką linię
include('db.php');
lub
include('sqlite.php');
Ewentualnie zamiast include masz require (z _once lub bez). Musisz to też dodać w powyższym skrypcie.
EDIT: ewentualnie nic nie zmieniaj i wywołaj skrypt z takiego linka http://www.history.is.net.pl/status, tylko skrypt status.php musi byś w tym samym folderze, co np. uzytkownicy.php.
To wrzuć oryginalny skrypt status.php (bez zmian) tam gdzie masz plik uzytkownicy.php (katalogo_glowny/templates/) i wywołaj skrypt z takiego linka http://www.history.is.net.pl/status
Teraz (mam nadzieję) zmiany czasu powinny się pojawić (tylko bądź zalogowany w swoim serwisie). Ewentualnie zamknij i otwórz ponownie SQLite Administratora i zobacz.
– Dodane 09.01.2013 (Śr) 23:14 –
Pamiętaj tylko, że w tym kodzie, co Ci podałem, zmienić czas na status_uzytkownika :
$q = $db->prepare('UPDATE uzytkownicy SET status_uzytkownika = DATETIME(\'NOW\') WHERE id = :id');
<?php
$db = new PDO('sqlite:darom.sqlite');
$db->exec('UPDATE uzytkownicy SET status_uzytkownika = DATETIME(\'NOW\') WHERE id = 2');
echo 'exec done.
';
?>
Powinien on zmienić czas dla pierwszego użytkownika w bazie (id=2).
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [14] unable to open database file' in /home/users/history/public_html/templates/status.php:2 Stack trace: #0 /home/users/history/public_html/templates/status.php(2): PDO->__construct('sqlite:darom.sq...') #1 {main} thrown in /home/users/history/public_html/templates/status.php on line 2