Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skrypt użytkownicy online
Forum PHP.pl > Forum > PHP
parox
Witam.

Napisałem owy skrypt mający na celu sprawdzanie użytkowników online.

  1. <?php
  2.  
  3. include ('engine/config.php');
  4. include ('lang/en/bloks.php');
  5.  
  6.  
  7. $time_now_uo = time();
  8. echo $time_now_uo . '<br />';
  9. $old_time_uo = time()-540;
  10.  
  11. if (isset ($_SESSION['user_id'])) {
  12. $uidc = $_SESSION['user_id'];
  13. $sql_un = "SELECT username FROM " . $db_prefix . "users WHERE id='$uidc'";
  14. $un = mysqli_query($dbc, $sql_un);
  15. $username = mysqli_fetch_array($un);
  16. $unl = $username['username'];
  17.  
  18. if($unl != false) {
  19. $sql_uo_u = "UPDATE " . $db_prefix . "users_online SET time='$time_now_uo' WHERE username='$unl'";
  20. mysqli_query($dbc, $sql_uo_u);
  21. } else {
  22. $sql_uo_a = "INSERT INTO " . $db_prefix . "users_online ('username' ,'time') VALUES ('$unl', '$time_now_uo')";
  23. mysqli_query($dbc, $sql_uo_a);
  24. }
  25. }
  26.  
  27. $sql_uo_d = "DELETE FROM " . $db_prefix . "users_online WHERE time < '$old_time_uo'";
  28. mysqli_query($dbc, $sql_uo_d);
  29.  
  30. $sql_sun = "SELECT username FROM " . $db_prefix."users_online ORDER BY username";
  31. $sun = mysqli_query($dbc, $sql_sun);
  32. if (mysqli_num_rows($sun) != 0) {
  33. echo $lang_bloks_bstats_uo . ': ';
  34. while($user_name = mysqli_fetch_array($sun)) {
  35. echo $user_name['username'] . ', ';
  36. }
  37. } else {
  38. echo $lang_bloks_bstats_nuo;
  39. }
  40.  
  41. ?>


Niestety nie zupełnie działa i nie wiem dlaczego... Czy ktoś mógłby zdefiniować co zrobiłem źle?

Baza:
  1. CREATE TABLE `frycms`.`fry_users_online` (
  2. `username` VARCHAR( 20 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
  3. `time` INT NOT NULL ,
  4. PRIMARY KEY ( `username` )
  5. ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci;


Dzięki za pomoc.
Fifi209
Nie działa - co to znaczy? Jakiś błąd? Sprawdzałeś czy mysql_error coś wyrzuca? A może błąd w samym kodzie?
parox
Hmm. Błędu nie wywala. Po prostu nie wysyła do bazy żadnych zapytań, i nic w bazie się nie dzieje.
mysqli_error także nic nie wybija.

// Edit

A na stronie wyświetla
Cytat
1265655100
No users online


Czyli
echo $time_now_uo . '<br />'; Linia 9
echo $lang_bloks_bstats_nuo; Linia 39
Fifi209
Muszę zapytać, masz w ogóle połączenie z bazą? Masz włączone wyświetlanie błędów?
parox
Połączenie z bazą mam. Pierwsze linijki wczytują konfigurację bazy i reszta skryptu jest na tym oparta (Rejestracja, Logowanie etc.) i działa. Domyślnie czy mam, chyba tak. localhost zainstalowany z XAMPP pod Ubuntu. I po dodaniu owej linijki na początek skryptu także nic.

^ Aktualizacja mojego posta wyżej.
Fifi209
Wiesz... dałeś tylko część kodu, dlatego pytam o głupie rzeczy. Trudno, aby mysql_error coś zwracał skoro powinieneś użyć mysqli_error - takie moje niedopatrzenie.
parox
Użyłem mysqli a nie mysql. Nie jestem aż tak głupi i wiem czego używałem i co sprawdzać ;]
Połączenie z bazą (config.php)
  1. <?php
  2.  
  3. $system_installation = true;
  4. $db_host = 'localhost';
  5. $db_name = 'frycms';
  6. $db_user = 'root';
  7. $db_pass = '';
  8. $db_prefix = 'fry_';
  9.  
  10. $dbc = @mysqli_connect ($db_host, $db_user, $db_pass, $db_name)
  11. OR die ('Cannot connect to the database, reason:<br /> ' .mysqli_connect_error() );
  12.  
  13.  
  14. ?>


A w include nr. 2 są tylko zmienne w których są zdania które właśnie są wyświetlane na stronie. Działają zmienne, SQL connection też bo jak dam
echo $uidc;
Powiedzmy w 14 linii to wyświetla mi jako kto jestem zalogowany.
altruista2
Błąd tkwi tu:
  1. $unl = $username['username'];
  2.  
  3. if($unl != false) {
  4. $sql_uo_u = "UPDATE " . $db_prefix . "users_online SET time='$time_now_uo' WHERE username='$unl'";
  5. mysqli_query($dbc, $sql_uo_u);
  6. } else {
  7. $sql_uo_a = "INSERT INTO " . $db_prefix . "users_online ('username' ,'time') VALUES ('$unl', '$time_now_uo')";
  8. mysqli_query($dbc, $sql_uo_a);
  9. }


jeśli $unl to fałsz wywolujesz INSERT username=$unl, czyli username=''

jeśli nazwa użytkownika zapisana jest w sesji podmień kod na:
  1. $sql_uo_a = "INSERT INTO " . $db_prefix . "users_online ('username' ,'time') VALUES ('".$_SESSION['username']."', '$time_now_uo')";
parox
Zmodyfikowałem trochę kod. Wygląda on teraz tak:
  1. <?php
  2.  
  3. include ('engine/config.php');
  4. include ('lang/en/bloks.php');
  5.  
  6.  
  7. $time_now_uo = time();
  8. echo $time_now_uo . '<br />';
  9. $old_time_uo = time()-540;
  10.  
  11. if (isset ($_SESSION['user_id'])) {
  12.  
  13. $sql_check_un = "SELECT username FROM " . $db_prefix . "users_online WHERE username='" . $_SESSION['username'] . "'";
  14. $cun = mysqli_query($dbc, $sql_check_un);
  15. $check_un = mysqli_fetch_array($cun);
  16.  
  17. echo $_SESSION['username'] . '<br />';
  18.  
  19. if($check_un['username'] == $_SESSION['username']) {
  20. $sql_uo_u = "UPDATE " . $db_prefix . "users_online SET time='$time_now_uo' WHERE username='" . $_SESSION['username'] . "'";
  21. mysqli_query($dbc, $sql_uo_u);
  22. } else {
  23. $sql_uo_a = "INSERT INTO " . $db_prefix . "users_online ('username' ,'time') VALUES ('" . $_SESSION['username'] . "', '$time_now_uo')";
  24. mysqli_query($dbc, $sql_uo_a);
  25. }
  26. }
  27.  
  28. $sql_uo_d = "DELETE FROM " . $db_prefix . "users_online WHERE time < '$old_time_uo'";
  29. mysqli_query($dbc, $sql_uo_d);
  30.  
  31. $sql_sun = "SELECT username FROM " . $db_prefix."users_online ORDER BY username";
  32. $sun = mysqli_query($dbc, $sql_sun);
  33. if (mysqli_num_rows($sun) != 0) {
  34. echo $lang_bloks_bstats_uo . ': ';
  35. while($user_name = mysqli_fetch_array($sun)) {
  36. echo $user_name['username'] . ', ';
  37. }
  38. } else {
  39. echo $lang_bloks_bstats_nuo;
  40. }
  41.  
  42. ?>


Ale jednak nic to nie dało.
altruista2
dopisz ta końcu skryptu
  1. echo '<pre>'; print_r($_SESSION); echo '</pre>';


i "pochwal" się name co PHP wypluł, bo z tym $_SESSION['username'] to strzelałem że taka zmienna może być zapisywana w sesji.
parox
Taką tworzyłem więc taka jest.
Kod
Array
(
    [user_id] => 1
    [username] => parox
    [wba] => 0e2a9165b883b8145bfe5b9abba498c8
)

wba - web browser agent.

Więc nikt nie zna przyczyny braku funkcjonalności?

Jakieś rozwiązanie?
altruista2
Sprawdź może w phpmyadminie czy użytkownicy faktycznie się dodają do tabeli users_online?
parox
No właśnie w tym rzecz że nie... Wyświetlać by się wyświetlały bo sprawdzałem dodając INSERTem.
altruista2
To chyba musisz troszke podebugować smile.gif
  1. if($check_un['username'] == $_SESSION['username']) {
  2. $sql_uo_u = "UPDATE " . $db_prefix . "users_online SET time='$time_now_uo' WHERE username='" . $_SESSION['username'] . "'";
  3. echo $sql_uo_u;
  4. mysqli_query($dbc, $sql_uo_u);
  5. } else {
  6. $sql_uo_a = "INSERT INTO " . $db_prefix . "users_online ('username' ,'time') VALUES ('" . $_SESSION['username'] . "', '$time_now_uo')";
  7. echo $sql_uo_a;
  8. mysqli_query($dbc, $sql_uo_a);
  9. }


Będziesz wiedział gdzie jest błąd smile.gif
parox
Kod
1265748780
parox
INSERT INTO fry_users_online ('username' ,'time') VALUES ('parox', '1265748780')No users online

Array
(
    [user_id] => 1
    [username] => parox
    [wba] => 0e2a9165b883b8145bfe5b9abba498c8
)


A kiedy dodaję wpis poprzez phpMyAdmin zapytanie jest takie:
  1. INSERT INTO `frycms`.`fry_users_online` (`username`, `time`) VALUES ('parox', '1265749209');

Próbowałem i tak z tym że zamieniłem to co trzeba na zmienne. Dalej nic. A kiedy już dodałem do bazy danych owy wpis, na stronie wygląda tak:
Kod
1265749533
parox
UPDATE fry_users_online SET time='1265749533' WHERE username='parox'
Users online: parox,

Array
(
    [user_id] => 1
    [username] => parox
    [wba] => 0e2a9165b883b8145bfe5b9abba498c8
)


W dodatku wpis w bazie aktualizuje się.
altruista2
Wszystko jasne, niby z pozoru banalny błąd - ale trudny do wychwycenia biggrin.gif

zamień
  1. $sql_uo_a = "INSERT INTO " . $db_prefix . "users_online ('username' ,'time') VALUES ('" . $_SESSION['username'] . "', '$time_now_uo')";

na to:
  1. $sql_uo_a = "INSERT INTO " . $db_prefix . "users_online (`username` ,`time`) VALUES ('" . $_SESSION['username'] . "', '$time_now_uo')";


i będzie działać smile.gif
parox
E, nie za bardzo wiem Co zmieniłeś poza tylko 4-ema ' na `.

Działa. Dzięki.
Fifi209
Tylko to zmienił, bo tylko to było problemem. Swoją drogą jeżeli nie dajesz nigdzie nazw pól w `` to konsekwentnie rób to do końca skryptu, jeżeli chcesz dawać to rób to wszędzie.
parox
A jak ominę i dam np. (username, time) to zaszkodzi?
altruista2
Nie. O ile nie masz spacji albo innych specjalnych znaków w nazwie kolumn/tabeli.

Jeśli mogę mieć prośbę do twórców tego forum to bardzo bym prosił zmienić czcionkę kodu php/sql itd. na monospace np. Courier Sans itp. Dziękuję smile.gif
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.