Newsgroup: it.comp.www.php
Titolo: Login Unico

Ciau a tutti,
effettuo un login sfruttando un database in cui sono contenuti password e
nickname dell'utente. Come faccio per assicurarmi che un utente non possa
loggarsi due volte contemporaneamente? Esiste un modo semplice in poche
righe?
CIAU


io, quando un utente si collega, creo un file di sessione
in una certa directory. (il nome del file inizia col nome utente
e continua con caratteri quasi casuali, e il file contiene
il nome dell'utente, altre info ma non contiene la password)
se l'utente cercasse di fare un' altro login
una mia piccola funzione si accorgerebbe che esiste gia'
una sessione (file) dello stesso utente e non
lo permetterebbe.
non so se e' una buona soluzione, comunque per ora
funziona.
il problema e' che se l'utente non si sconnette con logout
ma semplicemente chiude la finestra, in questo caso
rimane il file di sessione. (accetto suggerimenti)
ciao
davide


Suggerimento: se 2 utenti si collegano in sequenza con la stessa login
allore l'ultimo utente collegato scaccia l'altro...
spero ti sia venuta l'intuizione :-)
ciao
Stefano

 davide
Ciao!
Un buon rattoppo sarebbe, secondo me, inviare insieme a tutte le successive
richieste che ti fa un utente anche il suo nome utente o un ID che lo
identifichi ed ogni volta che questo succede fai un timestamp nel famoso
file. Dopo un tempo di inattività grade quanto vuoi tu l'utente viene
scollegato e si può riloggare quando vuole.
Impostare un timeout, insomma...
Ciao, buon lavoro e buon anno nuovo! :)
-- 
WulfMp3
wul...@email.it
"Poni cio' che sei nel minimo che fai."

Ma la cosa più semplice non sarebbe controllare con un IF se l'utente è
loggato... in tal caso non farlo ri-loggare?????


doh!!
if where?
cmq io ho fatto una piccola tabella, dove e' contenuto IP, ID e timestamp
dell'ultima pagina caricata, in poche parole in tutte le pagine ho un
include che fa una cosa del genere:
leggo in session l'ID
se ID=0 o nullo allora
        leggo IP utente
lo cerco nella tabella
cerco il valore (IP o ID nella tabella corrispondente)
se lo trovo, update
se non lo trovo lo inserisco
con questa funzione basta che imposti il login che ti salva in session l'ID,
ed hai anche il numero degli utenti collegati, quelli registrati e quelli
no, e rspettivi IP, precisamente uso questa funzione (e questa e' l'ultima
volta che la posto.. lol)
per l'accesso utilizzo una classe, ma per quello sostituisci con quello che
ti serve
function USERONLINE($userid)
{
 global $db_bibivu;
 $ip = getenv(REMOTE_ADDR);
 $timeout = 15;
 $deltime = time()-($timeout*60);
 $db_bibivu->query("DELETE FROM USERONLINE WHERE time<'$deltime'");
 if($userid!=0)
  {
  $usronline = $db_bibivu->query_first("SELECT COUNT(time) as totTime FROM
USERONLINE WHERE ID='$userid' LIMIT 1");
  $nick = getUsername($userid);
  if($usronline[totTime]>0)
   $db_bibivu->query("UPDATE USERONLINE SET time='".time()."', ID='$userid',
nick='$nick' WHERE ID='$userid'");
  else
   $db_bibivu->query("INSERT INTO USERONLINE VALUES
('".time()."','$ip','$userid','$nick')");
        }
 else
  {
  $usronline = $db_bibivu->query_first("SELECT COUNT(time)as totTime FROM
USERONLINE WHERE IP='$ip' LIMIT 1");
  if($usronline[totTime])
   $db_bibivu->query("UPDATE USERONLINE SET time='".time()."' WHERE
IP='$ip'");
        else
   $db_bibivu->query("INSERT INTO USERONLINE VALUES
('".time()."','$ip','','',0)");
  }
}
per controllare se un utente e' connesso:
function checkUSERONLINE($userid="0") {
 global $db_bibivu, $s_userid, $s_online, $debug;
 //se userid == 0
 //l'utente non e' on-line
 if ($userid=="0" || $userid=="")
  $ritorno = 0;
 elseif ($userid =="IP")
  {
  $ip = getenv(REMOTE_ADDR);
  $totID = $db_bibivu->query_first("SELECT COUNT(id)as totID FROM USERONLINE
WHERE IP='$ip' LIMIT 1");
  $ritorno = $totID[totID];
  if ($debug==1) echo "read DB ";
  }
 else
  {
  if ($s_userid!=$userid || intval($s_online)<=0)
   {
   $totID = $db_bibivu->query_first("SELECT COUNT(ID) as totID FROM
USERONLINE WHERE ID='$userid' LIMIT 1");
   $ritorno = $totID[totID];
   if ($debug==1) echo "read DB ";
   }
  else
   $ritorno=1;
  }
 if ($debug==1) echo "checkUSERONLINE: userid-$userid return-$ritorno
s_online-$s_online s_userid-$s_userid <br>".chr(13);
 return $ritorno;
}
e qui per sapere il numero degli utenti:
function NumUSERONLINE($TipoUt="R") {
    global $db_bibivu;
 if ($TipoUt=="R")  //UTENTI REGISTRATI
  $totID = $db_bibivu->query_first("SELECT COUNT(ID)as totID FROM USERONLINE
WHERE ID<>'0' LIMIT 100");
 else     //UTENTI NON REGISTRATI
  $totID = $db_bibivu->query_first("SELECT COUNT(ID)as totID FROM USERONLINE
WHERE ID='0' LIMIT 100");
 return $totID[totID];
}
spero che sia di aiuto!!!
possibile metterle nelle faq (se sono buone funzioni.. si capisce)


grazie!!
penso che faro' cosi', mi sembra una soluzione buona
buon anno!
ciao
davide

 allore l'ultimo utente collegato scaccia l'altro...
ci avevo pensato (vagamente), ma volevo farlo in modo
tale che questo potesse succedere solo dopo un periodo
di inattivita' della vecchia sessione.
(leggendo i vari post cerco di capire qual'e' il modo
migliore)
ci provo :-)
grazie
ciao
davide

  if($usronline[totTime]>0)
Credo sia piu' efficiente cosi':
	$usronline = $db_bibivu->query_first("SELECT nick, COUNT(nick)
as cnt FROM USERONLINE WHERE ID='$userid' GROUP BY nick;");
	if ($usronline['cnt'] > 0)
	{
		$nick = $usronline['nick'];
		// *** SQL Warning: SET field=value WHERE field=value
		// is useless. ***
		$db_bibivu->query("UPDATE USERONLINE SET
time='".time()."' WHERE ID='$userid'");
	}
	else
	{
		$nick = getUsername($userid);
		$db_bibivu->query("INSERT INTO USERONLINE VALUES
		('".time()."','$ip','$userid','$nick')");
		// *** Zend Warning: 'ip' is not defined above. ***
        }
Nel caso che l'utente sia gia' connesso (e in una navigazione, e' il
caso normale; solo la prima volta non lo sara'), ti risparmi di fare
una chiamata a getUsername, che suppongo usi SQL.
Leonardo

 wrote in message
news:ffl51v4e3s7hksats...@L.Serni...

ok, controllero'!!
grazie