Lista zalogowanych użytkowników

0

Witam ! Próbuje na moją strone wrzucić liste zalogowanych użytkowników. Działa to na zasadzie aktywności w ciągu ostatnich 600 sekund. Jest stworzona tabela która zawiera pola nick login mail id oraz oczywiście czas. Niestety nie umie sprawić aby w momencie logowania wypełniała sie ona aktualnym czasem. Cały czas wyrzuca mi :"brak zalogowanych użytkowników" Czy mój tok rozumowania jest prawidłowy ? Prosze o pomoc
Oto Fragment kodu :

 

<?php 
if(!session_is_registered("uzytkownik")) 
{ 
$zap1=mysql_query("select from `uzytkownicy` WHERE `nick` = '$nick' and `haslo` = '$haslo' "); 
if(mysql_num_rows($zap1) > 0) 
{ 
session_register("uzytkownik"); 
$_SESSION['nick'] = $nick; 
$czas = date("U"); 

$sql = mysql_query("update `uzytkownicy` set `czas` = '$czas' where `nick` = '$nick'"); 

} 



$czas_teraz = date("U"); 
$czas_max = $czas_teraz - 600; 

$sql_zalogowani = mysql_query("select from `uzytkownicy` where `czas` BETWEEN '$czas_max' AND '$czas_teraz'"); 

if(@mysql_num_rows($sql_zalogowani) < 1){ 
echo '<left>brak zalogowanych użytkowników!</left><br>'; 

} else { 

echo (mysql_num_rows($sql_zalogowani)); 
echo '<ul>'; 
while($dane = mysql_fetch_array($sql_zalogowani)){ 

echo '<li>'.$dane['nick'].'</li>'; 


} 

echo '</ul>'; 

} 

} 
?>
0

Tak na pierwszy rzut oka, to między select i from powinno chyba coś być.

0

Tam jest oczywiście gwiazdka, źle sie skopiowało.

0

Jakby ktoś miał problem z przeczytaniem kodu, to tutaj wrzucam sformatowaną wersję:

<?php 
if(!session_is_registered("uzytkownik")) 
{ 
  $zap1=mysql_query("select * from `uzytkownicy` WHERE `nick` = '$nick' and `haslo` = '$haslo' "); 
  if (mysql_num_rows($zap1) > 0) 
  { 
    session_register("uzytkownik"); 
    $_SESSION['nick'] = $nick; 
    $czas = date("U");  
    $sql = mysql_query("update `uzytkownicy` set `czas` = '$czas' where `nick` = '$nick'"); 
  } 
  
  $czas_teraz = date("U"); 
  $czas_max = $czas_teraz - 600; 
 
  $sql_zalogowani = mysql_query("select * from `uzytkownicy` where `czas` BETWEEN '$czas_max' AND '$czas_teraz'"); 
 
  if (@mysql_num_rows($sql_zalogowani) < 1)
  { 
    echo '<left>brak zalogowanych użytkowników!</left><br>';  
  } else
  { 
    echo (mysql_num_rows($sql_zalogowani)); 
    echo '<ul>'; 
    while($dane = mysql_fetch_array($sql_zalogowani))
    {  
      echo '<li>'.$dane['nick'].'</li>';  
    } 
    echo '</ul>';  
  }  
} 
?>
0

ja bym tam zrobił: czas jako DATETIME oraz wstawiał aktualny czas jako NOW()

przy porównywaniu bym zrobił tak:
DATE_ADD(czas, INTERVAL 600 SECOND)>=NOW()

0
<?php
// zakładam, że $nick i $haslo zawieraja te dane i są zescapeowane
if (!isset($_SESSION['zalogowany'])) {
  $rResult = mysql_query("SELECT COUNT(*) as cnt FROM uzytkownicy WHERE nick='$nick' AND haslo='$haslo' LIMIT 1");
  $aRow = mysql_fetch_assoc($rResult);
  if ($aRow['cnt']) {
    $_SESSION['zalogowany']=$nick; // tutaj możesz chcieć zapisać niezescapeowany string, tylko nie ruszaj zmiennej nick zważywszy na to poniżej
    mysql_query("UPDATE uzytkownicy SET czas = UNIX_TIMESTAMP(NOW()) WHERE nick='$nick' LIMIT 1")
  }
  unset($aRow, $rResult);
}
else { // nie rozumiem czemu nie updateowales czasu kiedy ktos jest juz zalogowany?
  mysql_query("UPDATE uzytkownicy SET czas = UNIX_TIMESTAMP(NOW()) WHERE nick='$nick' LIMIT 1")
}

$rResult = mysql_query("SELECT nick FROM uzytkownicy WHERE czas+60*5 >= NOW()"); // 5 minut
$iIlosc = mysql_num_rows($rResult);
if ($iIlosc) {
  echo "Zalogowani: <ul>";
  while ($aRow = mysql_fetch_assoc($rResult)) {
    echo '<li>'.$aRow['cnt'].'</li>';
  }
  echo "</ul>";
  unset($aRow);
}
else {
  echo 'Brak zalogowanych użyszkodników';
}
unset($rResult, $iIlosc);
?>

jak nic nie walnalem to bedzie git

edit:
"zostawiłem" pola w bazie jako inty, ale warto byłoby zmienić je wg sugestii krwq na DATETIME

0

Dzięki za pomoc, ale niestety nadal wywala brak zalogowanych uzytkowników( Czas w bazie =0)

0

no to zostaje Ci debugowanie np. metodą "debugowania przez dupczenie". ;)
pierwszy wynik z google wszystko wyjaśnia (i nie trzeba klikać)
http://www.google.pl/search?hl=pl&safe=off&site=&q=debugowanie+przez+dupczenie

generalnie wypluwasz echo z jakimś tekstem (może być i "dupa", tylko musisz je rozróżnić) po każdym warunku (i ew wyświetlasz wartość zmiennych), żeby sprawdzić w którym miejscu nie wykonuje się to, czego oczekujesz. wieczorem mogę jeszcze spróbować uruchomić ten kod i Ci coś pomóc, w międzyczasie popróbuj sobie sam (umiejętność debugowania przyda Ci się jeszcze jakieś pi*(666^∞) razy, więc..)..

0

// zakładam, że $nick i $haslo zawieraja te dane i są zescapeowane
głupie pytanie , a co to oznacza ze są zascapeowane ?

0

http://pl.wikipedia.org/wiki/SQL_injection

Przeczytaj sobie całe - a w paragrafie "Zabezpieczanie na poziomie aplikacji" masz rozwiązanie

0

Próbowałem 'debugowania przez dupczenie' jedynie pierwszy if if (!isset($_SESSION['zalogowany'])) jest spełniony reszta ani rusz...tabela uzytkownicy zawiera pola nick haslo email ip id czas.

0

a zrób sobie zaraz po tym ifie echo "nick -- $nick -- haslo -- $haslo --"; i zobacz czy to pasuje do danych, które masz w bazie danych

1 użytkowników online, w tym zalogowanych: 0, gości: 1