[PHP][SQLite/MySQL]Pokazywanie kto jest online...

Języki, których efekty są wykonywane po stronie serwera. PHP, ASP czy CGI w połączeniu z bazami danych SQL dają niezwykłe możliwości budowy i zarządzania stron WWW. Tu zadajemy pytania oraz demonstrujemy kod, z którym mamy problem.
HaWaJ
Nowy
Nowy
Posty: 159
Rejestracja: pt kwie 06, 2007 5:12 pm

[PHP][SQLite/MySQL]Pokazywanie kto jest online...

Post autor: HaWaJ »

Witam, mam mała rozterkę, ponieważ kompletnie nie wiem jak zrobić aby wyświetlało tylko tych użytkowników którzy są online. Myślalem nad wstawieniem do tabeli jakiegoś rekordu ale wątpie żeby to było jakieś dobre rozwiązanie.

PS. Jaki też jest dobry sposób na zliczanie i pokazywanie ilu użytkowników jest online np.

Kod: Zaznacz cały

Na stronie jest 2 gości i 5 użytkowników.
Poszperałem trochę w google ale nie dowiedziałem się niczego specjalnego. Również na tym forum starałem się poszukać i nic nie znalazłem.

Nie oczekuję tutaj gotowca tylko sugestii jakim tropem pójść.

Z góry dzięki :)
Riklaunim
Nowy
Nowy
Posty: 180
Rejestracja: pt mar 14, 2003 2:33 am
Kontakt:

Re: [PHP][SQLite/MySQL]Pokazywanie kto jest online...

Post autor: Riklaunim »

ustawiasz userowi cookie ze znacznikiem czasu - time().

1. jeżeli znacznik czasu jest starszy niż 5 minut (przykładowo) to go aktualizujesz wraz z aktualizacją wpisu w bazie danych (znacznik czasu danego usera)
2. by wyświetlić kto jest online liczysz ilu userów ma w tabeli znacznik czasu nie starszy niż 5 minut :)
HaWaJ
Nowy
Nowy
Posty: 159
Rejestracja: pt kwie 06, 2007 5:12 pm

Re: [PHP][SQLite/MySQL]Pokazywanie kto jest online...

Post autor: HaWaJ »

Dzieki wielkie ;) Teraz to juz raczej bede wiedzial jak to zrobic :)

Teraz kolejny problem...zrobilem skrypt ze po kliknieciu na uzytkownika wyswietla sie informacja na jego temat. Ale... wyswietla sie tylko ostatniego, ktory sie zarejestrowal. Daje kod:

[php]<?php session_start(); ?>
<?php
$db = sqlite_open('install/users.db');
$read = sqlite_query($db, "SELECT*FROM users");
while ($row = sqlite_fetch_array($read)){
$id = $row[0];
echo ''.$row[1],$row[2].'<a href="users.php?action='.$id.'">INFO</a><br>';
}

if ($_GET['action'] == $id):

$read = sqlite_query($db, "SELECT*FROM users WHERE id='$id'");
while ($row = sqlite_fetch_array($read)){
echo $row[1];
}
endif;
?>
[/php]

Jak wrzuce $_GET['action']...... do petli while to wszystko jest ok, aczkolwiek nazwy uzytkownikow znajdujacych sie nizej znikaja i wyglada to bardzo nieestetycznie :) Z gory dzieki :)
Ostatnio zmieniony pt kwie 20, 2007 2:44 pm przez HaWaJ, łącznie zmieniany 1 raz.
123456
Zaczyna działać
Zaczyna działać
Posty: 514
Rejestracja: sob paź 28, 2006 1:19 pm

Re: [PHP][SQLite/MySQL]Pokazywanie kto jest online...

Post autor: 123456 »

Ale... wyswietla sie tylko ostatniego, ktory sie zarejestrowal.
Gdybyś się tak dokładnie przyjrzał, spróbował wczuć się w rolę parsera PHP i w pamięci analizował co się po kolei dzieje z Twoim kodem, to zrozumiałbyś, co robisz nie tak. Podpowiem, że kod jest dobry ale nie wykonuje tego co chciałeś ponieważ źle napisałeś warstwę logiczną kodu.

BTW. Jeśli sam nie nauczysz się myśleć i analizować kodu to będziesz tu przychodzić z każdym g..... (drobnym problemikiem) a nam sie znudzi tak ciągle pokazywać proste błędy.
HaWaJ
Nowy
Nowy
Posty: 159
Rejestracja: pt kwie 06, 2007 5:12 pm

Re: [PHP][SQLite/MySQL]Pokazywanie kto jest online...

Post autor: HaWaJ »

Bawiłem się z tym skryptem dzisiaj jakies 2h i nie umiem rozgryźć :( Wydaje mi się że wszystko ok a jednak zawsze się coś psuje. Próbowałem wszystko umieścić w warunku SWITCH ale też nie pomagało. Kompletnie nie wiem co zrobić. Próbowałem myśleć (co mi jak widać nie wychodzi) jak praser no i nic. Przypuszczam że coś jest nie tak z:

[php]<?php session_start(); ?>
<?php
//....

if ($_GET['action'] == $id):

$read = sqlite_query($db, "SELECT*FROM users WHERE id='$id'");
while ($row = sqlite_fetch_array($read)){
echo $row[1];
}
endif;
?>
[/php]

Ale nie wiem dokładnie co. Oczywiście mogę się mylić.
Dziwie się że system newsów mi wyszedł dobrze a wyświetlanie informacji o userze... szkoda gadać :) Byłbym wdzięczny jakby ktoś napisał coś konkretniejszego bo jako "prasera" to ja siebie nie widzę :D
123456
Zaczyna działać
Zaczyna działać
Posty: 514
Rejestracja: sob paź 28, 2006 1:19 pm

Re: [PHP][SQLite/MySQL]Pokazywanie kto jest online...

Post autor: 123456 »

Nie zrobię tego za Ciebie bo warto żebyś sam doszedł co jest nie tak. Wyjdzie to tylko na dobre.

Kolejna podpowiedz:
Ale... wyswietla sie tylko ostatniego, ktory sie zarejestrowal.
Skoro sie tak dzieje to musza byc jakies powody. Tak wiec analizujemy kod:
[php]
<?php
$db = sqlite_open('install/users.db');

/* Pkt.1: Zapytanie pobiera WSZYSTKICH uzytkownikow*/
$read = sqlite_query($db, "SELECT*FROM users");

/* Pkt.2: W petli odczytujesz KOLEJNO KAŻDY wpis*/
while ($row = sqlite_fetch_array($read)){

$id = $row[0]; // w tej zmiennej trzymasz ID uzytkownika
echo ''.$row[1],$row[2].'<a href="users.php?action='.$id.'">INFO</a><br>';

}

/* Pkt.3: Za pierwszym przejsciem petli zmienna $id trzyma ID pierwszego uzytkownika, za drugim przejsciem ID drugiego i tak do konca. */
/* Pkt.4: W zwiazku z powyzszym po wyjsciu z petli zmienna $id trzyma ID OSTATNIEGO uzytkownika */

/* Pkt.5: Teraz te nieszczesne porownanie wartosci */
/* Pkt.6: W tablicy superglobalnej pod indeksem 'action' masz ID kolesia którego dane chcesz zobaczyć.*/

/* Pkt.7: Spojrz jeszcze raz na pkt. nr 4. Jaka wartosc jest wstawiona do porownania w if? Kiedy warunek będzie prawdziwy?*/

if ($_GET['action'] == $id):

$read = sqlite_query($db, "SELECT*FROM users WHERE id='$id'");
while ($row = sqlite_fetch_array($read)){
echo $row[1];

}
endif;
?>
[/php]
My Ciebie nie nauczymy myśleć. Możemy podpowiedzieć ale reszta należy do Ciebie. Już wiesz co robisz źle? A jeśli tak, to czy wiesz jak przerobić ten skrypt, żeby osiągnąć to co chcesz?
HaWaJ
Nowy
Nowy
Posty: 159
Rejestracja: pt kwie 06, 2007 5:12 pm

Re: [PHP][SQLite/MySQL]Pokazywanie kto jest online...

Post autor: HaWaJ »

Probuje i dalej nic :/ Niewiem moze mam jakas zacme w glowie. Wiem ze jest cos poknocone ze zmienna $id, indexem action i warunkiem....Tylko nie mam pojecia jak to naprawic - gdzie zadeklarowac zmienna, czy w ogole ja deklarowac, jak wpisuje samo $row[0] w miejsca indexu action, w warunku IF, przy pobieraniu danych z tabeli ($read = sqlite_query($db, "SELECT*FROM users WHERE id='$row[0]"); ) to wtedy juz nic nie działa, tzn nie czyta danych z tabeli.

Naprawde nie mam pomyslu na rozwiazanie.
HaWaJ
Nowy
Nowy
Posty: 159
Rejestracja: pt kwie 06, 2007 5:12 pm

Re: [PHP][SQLite/MySQL]Pokazywanie kto jest online...

Post autor: HaWaJ »

No to teraz napiszę jak mi się wydaje co mysli praser :)

Na początku jest otwierana baza danych, kolejnym krokiem jest pobranie z niej danych z tabeli users. Następnie dane sa odczytywane i zadeklarowanie zmiennej
'$id' (Tutaj jest wlasnie błąd, którego nie umiem rozwiązać - prawdopodobnie trzeba ta zmienna zadeklarowac w innym miejscu. Probowalem podpiać pod nia tablice co skutkowalo tym samym).
Teraz instrukcja 'IF' porownuje $_GET ze zadeklarowana zmienna $id. (warunek jest spelniony wtedy gdy GET = $id czyli wniosek jeden - id ostatniego uzytkownika). Teraz pobierane sa dane z tabeli users gdzie id jest rowne $id (czyli efekt jest ten sam co wyzej).
Tutaj mysle ze nie jest konieczne stosowanie petli while ale to chyba jest nie istotne.

probowalem w taki sposob napisac:

[php]<?php
$db = sqlite_open('install/users.db');

$read = sqlite_query($db, "SELECT*FROM users"); //pobranie informacji

while ($row = sqlite_fetch_array($read)){ //odczytanie informacji

echo ''.$row[1],$row[2].'<a href="users.php?action='.$row[0].'">INFO</a><br>'; // odnosnik do tablicy $_GET

}


if ($_GET['action'] == $row[0]): //porownanie wartosci

$read = sqlite_query($db, "SELECT*FROM users WHERE id='$row[0]");
$row = sqlite_fetch_array($read);
echo $row[1]; //wyswietlenie informacji

endif;
?>[/php]

NIe wiem czemu ale takie cos tez nie skutkuje.

PS. Nie chce zeby ktos za mnie ten kod pisal :) Chcialbym tylko zostac naprowadzony na jakies szczegolowe informacje. Ucze sie PHP troszke ponad 2 tyg. i jeszcze nie rozumiem wszystkiego. I pewnie szybko nie zrozumiem, ale coz wiedza nie przychodzi sama.
123456
Zaczyna działać
Zaczyna działać
Posty: 514
Rejestracja: sob paź 28, 2006 1:19 pm

Re: [PHP][SQLite/MySQL]Pokazywanie kto jest online...

Post autor: 123456 »

Kod napisałeś tak, że najpierw całość odczytujesz a później jeśli trzeba pokazać dane to je znowu odczytujesz. Proponuje podczas odczytu całości (czyli w pętli while) sprawdzić czy jest ustawione $_GET['action'] i jeśli w danym momencie odczytywane są dane, które masz później wyświetlić (czyli $id równa się $_GET['action']), to zapisujesz je sobie do jakiejś tablicy i po wyjściu z tabeli odczytujesz.
HaWaJ
Nowy
Nowy
Posty: 159
Rejestracja: pt kwie 06, 2007 5:12 pm

Re: [PHP][SQLite/MySQL]Pokazywanie kto jest online...

Post autor: HaWaJ »

No i teraz juz jakos działa :) Dziekuje Tobie bardzo :) Kod wygląda następująco:

[php]
<?php
$db = sqlite_open('install/users.db');


$read = sqlite_query($db, "SELECT*FROM users");


while ($row = sqlite_fetch_array($read)){ //odczyt z bazy danych

$id = $row[0]; //Zadeklarowanie zmiennej w ktorej sa przechowywane ID

echo 'Uzytkownik:'.$row[1].'<a href="users.php?action='.$id.'">INFO</a><br>';

if (isset($_GET['action'])): //Prawda jezeli $_GET[action] istnieje
$tablica = array($id =>$row[0]); //zapisanie danych do tablicy
if ($_GET['action'] == $id):
foreach($tablica as $key => $value){ //odczytanie danych
sqlite_query($db, "SELECT*FROM users WHERE id='$id'"); //pobranie informacji
echo 'HASLO: '.$row[2].'<br>'; //wyswietlenie
}

endif;
endif;

}

?>
[/php]

Jest tylko jedna mała wada (dla niektórych może być zaletą :P jak kto woli) - informacje użytkownika pokazywane są na tej samej stronie, tzn. jest lista uzytkownikow po kliknięciu na info pojawiąją się one pod nazwą usera po czym wyświetlani są kolejni userzy :) Ale tym to już sam się pobawię:) Jeszcze raz wielkie dzięki 123456 :)

EDIT:

No i problem z wyświetlaniem też udało mi się rozwiązać:)

[php]
<?php session_start(); ?>
<?php

if (isset($_GET['action'])): //Prawda jezeli $_GET[action] istnieje
$db = sqlite_open('install/users.db');
$read = sqlite_query($db, "SELECT*FROM users");
while ($row = sqlite_fetch_array($read)){ //odczyt z bazy danych
$id = $row[0]; //Zadeklarowanie zmiennej w ktorej sa przechowywane ID

if ($_GET['action'] == 'show'):
echo 'Uzytkownik:'.$row[1].'<a href="users.php?action='.$id.'">INFO</a><br>';
$tablica = array($id =>$row[0]); //zapisanie danych do tablicy
endif;
if ($_GET['action'] == $id):
foreach($tablica as $key => $value){ //odczytanie danych
sqlite_query($db, "SELECT*FROM users WHERE id='$id'"); //pobranie informacji
echo 'HASLO: '.$row[2].'<br>'; //wyswietlenie
}

endif;

}

endif;
?>
[/php]
Jeszcze raz Dzieki :)
123456
Zaczyna działać
Zaczyna działać
Posty: 514
Rejestracja: sob paź 28, 2006 1:19 pm

Re: [PHP][SQLite/MySQL]Pokazywanie kto jest online...

Post autor: 123456 »

Ale nawaliłeś kodu... no ale przecież każdy kiedyś zaczyna :wink:
informacje użytkownika pokazywane są na tej samej stronie, tzn. jest lista uzytkownikow po kliknięciu na info pojawiąją się one pod nazwą usera po czym wyświetlani są kolejni userzy
Może popatrz na trochę inna wersję, która też będzie osobno pokazywać listę i osobno dane user'a:

[php]<?php
$db = sqlite_open('install/users.db');
$sql = "SELECT*FROM users";

if(isset($_GET['action'])){ // jezeli trzeba pokazac pojedynczego kolesia

$id = (int)$_GET['action'];
$sql.= " where id = '".$id."'";
$res = sqlite_query($db, $sql);

$row = sqlite_fetch_array($res);

echo 'HASLO: '.$row[2].'<br>';

} else { // lista uzytkownikow

$res = sqlite_query($db, $sql);

while($row = sqlite_fetch_array($res))
{
echo 'Uzytkownik:'.$row[1].'<a href="users.php?action='.$row[0].'">INFO</a><br>';
}
}
?>[/php]
HaWaJ
Nowy
Nowy
Posty: 159
Rejestracja: pt kwie 06, 2007 5:12 pm

Re: [PHP][SQLite/MySQL]Pokazywanie kto jest online...

Post autor: HaWaJ »

Hehe no faktycznie moje sie troszke rozni :) Wazne ze dziala bez zarzutu :

http://www.cristiano14.cba.pl/register/index.php

login: admin
haslo: admin

Mozna zobaczyc co do tej pory wybazgrałem :) Nie jest to nic wielkiego ale mnie motywuje :D
Ostatnio zmieniony wt kwie 24, 2007 6:57 pm przez HaWaJ, łącznie zmieniany 1 raz.
HaWaJ
Nowy
Nowy
Posty: 159
Rejestracja: pt kwie 06, 2007 5:12 pm

Re: [PHP][SQLite/MySQL]Pokazywanie kto jest online...

Post autor: HaWaJ »

Witam :) To znowu ja...Jak zwykle mam problem :) Piszę skrypt wyświetlania kto jest w danej chwili online. Chciałbym to zrobić na ciasteczkach ale nie wiem jak sie za to zabrać. Konkretniej chodzi mi o coś takiego:

[php]<?php
//Tworzę ciasteczko z czasem wygaśnięcia 60 sek
setcookie('online',$uzytkownik,time()+60,1);
?>[/php]

I teraz opiszę mój problem, tak więc:

Co zrobić aby wstawić znacznik time() do tabeli w SQLite tak aby odliczalo czas danemu userowi. W tabeli mam uwzględnione:


[sql]CREATE TABLE....
....
online TIME,
.....[/sql]

Kombinowałem jak koń pod górę ale coś nie wychodzi :( Z góry dzięki.

EDIT:
Chyba ze do tego celu nie trzeba wykorzystywac COOKIE i wystarczy wrzucic sam znacznik time(). Nie wiem wlasnie czy to jest odliczane wtedy w bazie danych.
HaWaJ
Nowy
Nowy
Posty: 159
Rejestracja: pt kwie 06, 2007 5:12 pm

Re: [PHP][SQLite/MySQL]Pokazywanie kto jest online...

Post autor: HaWaJ »

No i rozpracowałem to :)

w pliku z logowaniem ustawilem w nastepujacy sposob COOKIE:

[php]<?php
$time = time() +60;
setcookie('online',$tuser_name,$time);

//Teraz dodawanie znacznika czasu do bazy danych:

sqlite_query($db, "UPDATE users SET online='$time' WHERE login='$user'_name");
?>[/php]

odczytuje to natomiast tak:

[php]<?php
echo $HTTP_COOKIE_VARS["online"];
sqlite_query($db, "SELECT*FROM users WHERE id='$id'");
if (time()+20 < $row[9]){
echo 'ONLINE';
}ELSE{
echo 'OFFINE';

}
?>[/php]

Chciałbym się dowiedzieć czy to dobry sposób ? Czy istnieją jakieś bardziej niezawodne ?

EDIT:

Wlasnie zauwazylem ze COOKIES nie jest chyba za bardzo potrzebne przy pisaniu tego typu skryptu :) Tutaj daje adres i prosilbym o przetestowanie:

http://cristiano14.cba.pl/register/index.php
ODPOWIEDZ