Strona 1 z 1

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

: śr kwie 18, 2007 1:12 pm
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 :)

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

: śr kwie 18, 2007 3:10 pm
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 :)

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

: pt kwie 20, 2007 8:01 am
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 :)

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

: pt kwie 20, 2007 9:24 am
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.

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

: pt kwie 20, 2007 5:37 pm
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

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

: pt kwie 20, 2007 7:31 pm
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?

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

: pt kwie 20, 2007 9:46 pm
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.

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

: sob kwie 21, 2007 4:52 pm
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.

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

: ndz kwie 22, 2007 11:47 am
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.

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

: ndz kwie 22, 2007 1:33 pm
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 :)

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

: ndz kwie 22, 2007 5:03 pm
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]

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

: ndz kwie 22, 2007 7:23 pm
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

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

: wt kwie 24, 2007 6:55 pm
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.

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

: śr kwie 25, 2007 3:18 pm
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