- Home
- Categorie
- Coding e Sistemistica
- PHP
- Stampare a video nomi utenti on-line sul sito
-
@Samyorn said:
ciao carlitos1982
potresti cominciare creando una tabella "online" dove al login inserisci id utente e data/ora (meglio timestamp
Ad ogni aggiornamento pagina, cambio pagina etc etc...indi meglio in un header o footer che ci sono in ogni pagina, fai un update della data/ora, così che, anche se non fa il logout ma esce chiudendo semplicemente il browser, hai comunque aggiornato l'ultimo "movimento" all'interno del sito
Per visualizzare gli online ti basterà prelevare da questa tabella gli id utente e nel contempo DELETare, nella stessa tabella, quelli il cui ultimo orario registrato è più vecchio di 1 ora
Ok...qualcosa ho capito...
quindi per prima cosa creo la tabella "online" e inserisco 3 campi, login utente e dataora?
-
@carlitos1982 said:
inserisco 3 campi, login utente e dataora?
id, id_utente, last(formato timestamp)
-
@Samyorn said:
id, id_utente, last(formato timestamp)
ok..fatto..
ora si dovrebbe creare una pagina utentionline.php che poi si andrà a includere li' dove voglio che esca l elenco dei nick online nel sito...
come va impostata questa pagina??:?
-
La tabella l'hai creata... hai creato o modificato una query esistente per fare sì che si inserisca il timestamp al login? Se sì la parte di visualizzazione la fai con una query in cui selezioni dalla tabella "online" tutti gli utenti che hanno un timestamp registrato e che sia meno vecchio di un'ora (o mezz'ora) e poi salvi i risultati in un ciclo while che visualizza nick dopo nick in fila (come nei forum)
query al database che seleziona i nick
if(esiste almeno un nick)
inizia lista
while(ci sono ancora nick)
scrivi nick
fine while
chiudi lista
fine ifTi serve aiuto per il codice?
keiske
-
@Privacy-Impresa said:
La tabella l'hai creata... hai creato o modificato una query esistente per fare sì che si inserisca il timestamp al login? Se sì la parte di visualizzazione la fai con una query in cui selezioni dalla tabella "online" tutti gli utenti che hanno un timestamp registrato e che sia meno vecchio di un'ora (o mezz'ora) e poi salvi i risultati in un ciclo while che visualizza nick dopo nick in fila (come nei forum)
query al database che seleziona i nick
if(esiste almeno un nick)
inizia lista
while(ci sono ancora nick)
scrivi nick
fine while
chiudi lista
fine ifTi serve aiuto per il codice?
keiske
si nella tabellacioè devo modificare anche la pagina relativa al login?
bhe..si..qualcosa di codice ..poi magari ci applico qualche modifica pure io...
-
prima si era bloccato un attimo il database e non ho potuto correggere una imprecisione... la ricopio
query al db
creazione array risultati
if(esiste almeno un nick)
inizia lista
while(controllo se c'è altro risultato)
scrivi nick
aumento flag array
fine while
chiudi lista
fine ifCome codice, molto al volo:
$query = "
SELECT id, id_utente, last
FROM online
WHERE last <> ''
";
$result = mysql_query($query)
or (mysql_error());
if(mysql_num_rows($result) != 0) { ?>
<div id="contenitore per gente online">
<ul>
<?php }
while ($array = mysql_fetch_array($result))
{
$arr_stripped = array_map("stripslashes", $array);
list($id, $id_utente, $last) = $arr_stripped;
?>
<li><?=$id_utente?></li>
<?php } ?>
</ul>
</div>
<?php } ?>Ti ho lasciato nel list() anche $id_utente e $last e ho messo solo $id nel <li></li> però ci vuoi il nick, quindi nella tabella online devi salvarci il nick e poi nel SELECT ci aggiungi nickname e nel list $nickname che poi metti nel <li>oi, last <> '' sono due apici singoli, non uno doppio, altrimenti ti dà errore e ci perdi 2 giorni a capire perchè
Spero di non aver fatto errori...
keiske
edit: alcune peculiarità... <div> e <ul> si aprono dopo l'if così se la ricerca non dà risultati non mette proprio il blocco con div e lista... se in caso di non connessi vuoi qualcosa di standard alla fine dell'if fai un else e ci metti dentro quello che vuoi visualizzare...
-
non ho chiara una cosa...te hai parlato di aggiungere al momente del login da parte dell utente nella tabella "online"l ora in cui si connette...quindi per fare ciò devo modificare la pagina login.php?
[PHP]
<?
session_start(); //avvio l'utilizzo delle sessioni$link = mysql_connect("$db_host", "$db_database", "$db_username", "$db_password") or die("Errore connessione: ". mysql_error());
mysql_select_db('my_italiawebchat') or die("Errore apertura database: " . mysql_error());
$selezione="SELECT nickname,password,sesso FROM iscritti WHERE nickname='".$_POST['nickname']."' AND password='". $_POST['password']."'";
$eseguisel=mysql_query($selezione);
if (mysql_num_rows($eseguisel) ==1) {
echo "Login effetuato con successo..Attendi";
//ciclo while che mi richiama l'array dei dati selezionati dal database
while($ROW = mysql_fetch_array($eseguisel))
{
//qui vanno settati un po' di SESSIONI
$_SESSION['logged']=1;//setto che l'utente è loggato
$_SESSION['nickname']=$ROW[nome];//inserisco una nuova chiave di sessione con il nome utente
$_SESSION['sesso']=$ROW[sesso];//inserisco una nuova chiave di sessione con il sesso dell'utente
}
//ora proseguo con l'header
header("Location: pannellodicontrollo.php");
exit;
} else {
echo "Dati non presenti nei nostri database..Attendi";
//annullo tutte le chiavi di sessioni se esistono
session_unset();
session_destroy();
header("Location: iscrizionesito.htm");
exit;
}
?>
[/PHP]
quesrta sarebbe la mia attuale pagina di login
-
Io onestamente invece di fare la tabella online aggiungerei il campo con l'ora del login nella tabella che hai già... a quel punto ti basta mettere:
Ipotizziamo il campo "logged" di tipo "timestamp"
if (mysql_num_rows($eseguisel) ==1) {
echo "Login effetuato con successo..Attendi";// di seguito modifichi l'utente nel campo "logged"
$query = "
UPDATE iscritti SET
logged = NOW()
WHERE nickname = '".$_POST['nickname']."'
";In questo modo al momento del login, se ha successo, alla voce "logged" della tabella inserisci l'attuale timestamp usando NOW()
Adesso allora nello script di prima la query la lanci alla tabella "iscritti" tirando fuori "nickname" dove "logged" <> '' (sempre apici singoli) e anche se "logged" è minore di NOW()-3600 (cioè se togliendo da quel momento un'ora il valore in logged è più piccolo)
logged <> '' AND logged < NOW()-3600
l'ultima riga controllala però tra le sintassi...
Ad ogni modo sei consapevole che inserendo nella query del login $_POST['nickname'] se non hai impostato un controllo al form ti esponi a sql injection? applica all'apertura della pagina un:
if($_POST['nickname'])
$nickname = mysql_real_escape($_POST['nickname']);
else
$nickname = "";E poi nella query gli passi $nickname
così sei più sicuro...
-
ho modificato cosi' la pagina login.php
[PHP]<?
session_start(); //avvio l'utilizzo delle sessioni
if($_POST['nickname'])
$nickname = mysql_real_escape($_POST['nickname']);
else
$nickname = "";$link = mysql_connect("$db_host", "$db_database", "$db_username", "$db_password") or die("Errore connessione: ". mysql_error());
mysql_select_db('my_italiawebchat') or die("Errore apertura database: " . mysql_error());
$selezione="SELECT nickname,password,logged,sesso FROM iscritti WHERE nickname='$nickname' AND password='". $_POST['password']."'";
$eseguisel=mysql_query($selezione);
if (mysql_num_rows($eseguisel) ==1) {
echo "Login effetuato con successo..Attendi";//inserisco nel campo logged l orario del login
$query = "
UPDATE iscritti SET
logged = NOW()
WHERE nickname = '".$_POST['nickname']."'
";//ciclo while che mi richiama l'array dei dati selezionati dal database
while($ROW = mysql_fetch_array($eseguisel))
{
//qui vanno settati un po' di SESSIONI
$_SESSION['logged']=1;//setto che l'utente è loggato
$_SESSION['nickname']=$ROW[nome];//inserisco una nuova chiave di sessione con il nome utente
$_SESSION['sesso']=$ROW[sesso];//inserisco una nuova chiave di sessione con il sesso dell'utente
}
//ora proseguo con l'header
header("Location: pannellodicontrollo.php");
exit;
} else {
echo "Dati non presenti nei nostri database..Attendi";
//annullo tutte le chiavi di sessioni se esistono
session_unset();
session_destroy();
header("Location: iscrizionesito.htm");
exit;
}
?>
[/PHP]ora credo si debba creare la pagina utentionline.php con il codice che hai inserito te prima...giusto?
eccola pagina utentionline.php che ho fatto..
[PHP]
<?
session_start(); //avvio l'utilizzo delle sessioni$link = mysql_connect("$db_host", "$db_database", "$db_username", "$db_password") or die("Errore connessione: ". mysql_error());
mysql_select_db('my_italiawebchat') or die("Errore apertura database: " . mysql_error());$query = "SELECT nickname,logged FROM iscritti WHERE logged <> '' AND logged < NOW()-3600 ''";
$result = mysql_query($query)
or (mysql_error());
if(mysql_num_rows($result) != 0) { ?>
<div id="contenitore per gente online">
<ul>
<?php }
while ($array = mysql_fetch_array($result))
{
$arr_stripped = array_map("stripslashes", $array);
list($nickname) = $arr_stripped;
?>
<li><?=$nickname?></li>
<?php } ?>
</ul>
</div>
<?php } ?>[/PHP]e giusta?
-
Mi sembra che vada... testala...
Solo come ho detto controlla "AND logged < NOW()-3600" che potrebbe non essere corretta quell'operazione svolta dentro la query... se del caso fai una cosa tipo:
$unorafa = time()-60*60;
AND logged < '$unorafa'
ovviamente logged dev'essere il valore in secondi, non un timestamp del tipo "12-06-2005 17:45:00" altrimenti devi prendere $unorafa e trasformarlo nel timestamp o prendere il timestamp e trasformarlo in secondi (più comoda la prima)
keiske
Poi dato che hai filtrato $nickname usalo anche qui:
UPDATE iscritti SET
logged = NOW()
WHERE nickname = '".$_POST['nickname']."'E infine fai la stessa cosa con $_POST['password']
keiske
-
nella pagina login.php
mi da il seguente errore..Fatal error: Call to undefined function: mysql_real_escape() in /membri/italiawebchat/login2.php on line 4
-
Oddio, mi sembrava proprio di aver editato per dire che stanotte ero fuso e la funzione è mysql_real_escape_string() e non mysql_real_escape()
keiske
-
@Privacy-Impresa said:
Oddio, mi sembrava proprio di aver editato per dire che stanotte ero fuso e la funzione è mysql_real_escape_string() e non mysql_real_escape()
keiske
cmq..ora il login..va..
ora nella pagina index dell utente loggato ho inserito con include
il file utentionline.php
purtroppo però da un errore
Parse error: syntax error, unexpected '}' in /membri/italiawebchat/utentionline.php on line 24
e un altra cosa che ho notato nel campo logged il tutto rimane cosi' 0000-00-00 00:00:00 ,nn segna l ora del login
-
Ok oggi sono più fresco... partiamo dall'errore prima...
if(mysql_num_rows($result) != 0) { ?>
<div id="contenitore per gente online">
<ul>
<?php }
while ($array = mysql_fetch_array($result))
{
$arr_stripped = array_map("stripslashes", $array);
list($nickname) = $arr_stripped;
?>
<li><?=$nickname?></li>
<?php } ?>
</ul>
</div>
<?php } ?>correggi in
if(mysql_num_rows($result) != 0) { ?>
<div id="contenitore per gente online">
<ul>
<?php
while ($array = mysql_fetch_array($result))
{
$arr_stripped = array_map("stripslashes", $array);
list($nickname) = $arr_stripped;
?>
<li><?=$nickname?></li>
<?php } ?>
</ul>
</div>
<?php } ?>Siccome io faccio il controllo inverso ho anche un else... dev'essere rimasta una graffa di chiusura che ora ho tolto...
Per il problema dell'ora... o non trova corrispondenze al where e quindi il NOW() non lo mette da nessuna parte o c'è un problema con NOW()... sarei più per il primo problema... hai poi messo $nickname al posto di $_POST['nickname']? Prova a dare degli "echo $nickname" per vedere se te lo mostra...
keiske
-
l errore non c'è piu'...
ma purtroppo nella pagina index non mi visualizza nulla..e anche sevado direttamente sulla pagina utentionline.php non mi fa vedere assolutamente nulla..
posto le pagine per interologin.php
[PHP]
<?
session_start(); //avvio l'utilizzo delle sessionisession_start(); //avvio l'utilizzo delle sessioni
if($_POST['nickname'])
$nickname = mysql_real_escape_string($_POST['nickname']);
else
$nickname = "";$link = mysql_connect("$db_host", "$db_database", "$db_username", "$db_password") or die("Errore connessione: ". mysql_error());
mysql_select_db('my_italiawebchat') or die("Errore apertura database: " . mysql_error());
$selezione="SELECT nickname,password,logged,sesso FROM iscritti WHERE nickname='$nickname' AND password='". $_POST['password']."'";
$eseguisel=mysql_query($selezione);
if (mysql_num_rows($eseguisel) ==1) {
echo "Login effetuato con successo..Attendi";//inserisco nel campo logged l orario del login
$query = "
UPDATE iscritti SET
logged = NOW()
WHERE nickname = '$nickname'
";//ciclo while che mi richiama l'array dei dati selezionati dal database
while($ROW = mysql_fetch_array($eseguisel))
{
//qui vanno settati un po' di SESSIONI
$_SESSION['logged']=1;//setto che l'utente è loggato
$_SESSION['nickname']=$ROW[nome];//inserisco una nuova chiave di sessione con il nome utente
$_SESSION['sesso']=$ROW[sesso];//inserisco una nuova chiave di sessione con il sesso dell'utente
}
//ora proseguo con l'header
header("Location: pannellodicontrollo.php");
exit;
} else {
echo "Dati non presenti nei nostri database..Attendi";
//annullo tutte le chiavi di sessioni se esistono
session_unset();
session_destroy();
header("Location: iscrizionesito.htm");
exit;
}
?>
[/PHP]poi utentionline.php
[PHP]
<?
session_start(); //avvio l'utilizzo delle sessioni$link = mysql_connect("$db_host", "$db_database", "$db_username", "$db_password") or die("Errore connessione: ". mysql_error());
mysql_select_db('my_italiawebchat') or die("Errore apertura database: " . mysql_error());$query = "SELECT nickname,logged FROM iscritti WHERE logged <> '' AND logged < NOW()-3600 ''";
$result = mysql_query($query)
or (mysql_error());
if(mysql_num_rows($result) != 0) { ?>
<div id="contenitore per gente online">
<ul><?php
while ($array = mysql_fetch_array($result))
{
$arr_stripped = array_map("stripslashes", $array);
list($nickname) = $arr_stripped;
echo"$nickname";
?>
<li><?=$nickname?></li>
<?php } ?>
</ul>
</div>
<?php } ?>
[/PHP]poi il problema della data...ancora c'è...da sempre gli 0000-000 ect...
io nella tabella iscritti ho già un campo di nome data con timestamp che mi conserva la data dell iscrizione dell utente...mica crea conflitto?
-
No non crea conflitto... allora per l'ora è presto detto...
//inserisco nel campo logged l orario del login
$query = "
UPDATE iscritti SET
logged = NOW()
WHERE nickname = '$nickname'
";La query è questa, salvata in $query... adesso va effettivamente lanciata... sai fare no?
Dopo vediamo il resto...
-
ok...fatta la query..[PHP]
<?
session_start(); //avvio l'utilizzo delle sessionisession_start(); //avvio l'utilizzo delle sessioni
if($_POST['nickname'])
$nickname = mysql_real_escape_string($_POST['nickname']);
else
$nickname = "";$link = mysql_connect("$db_host", "$db_database", "$db_username", "$db_password") or die("Errore connessione: ". mysql_error());
mysql_select_db('my_italiawebchat') or die("Errore apertura database: " . mysql_error());
$selezione="SELECT nickname,password,logged,sesso FROM iscritti WHERE nickname='$nickname' AND password='". $_POST['password']."'";
$eseguisel=mysql_query($selezione);
if (mysql_num_rows($eseguisel) ==1) {
echo "Login effetuato con successo..Attendi";//inserisco nel campo logged l orario del login
$query = "
UPDATE iscritti SET
logged = NOW()
WHERE nickname = '$nickname'
";
//eseguo la query che inserisce i dati nel campo logged
$eseguiquery=mysql_query($query);
//ciclo while che mi richiama l'array dei dati selezionati dal databasewhile($ROW = mysql_fetch_array($eseguisel))
{
//qui vanno settati un po' di SESSIONI
$_SESSION['logged']=1;//setto che l'utente è loggato
$_SESSION['nickname']=$ROW[nome];//inserisco una nuova chiave di sessione con il nome utente
$_SESSION['sesso']=$ROW[sesso];//inserisco una nuova chiave di sessione con il sesso dell'utente
}
//ora proseguo con l'header
header("Location: pannellodicontrollo.php");
exit;
} else {
echo "Dati non presenti nei nostri database..Attendi";
//annullo tutte le chiavi di sessioni se esistono
session_unset();
session_destroy();
header("Location: iscrizionesito.htm");
exit;
}
?>
[/PHP]
-
ok, adesso (scusa sono un perfezionsta pignolo) forse ti conviene spostare query ed esecuzione della query per l'ora dopo il while delle variabili di sessione...
In pratica prepari la prima query, la esegui, poi la scorri settando le sessioni e alla fine prepari e lanci la query per l'ora...
Così c'è ordine logico di esecuzione
Non dovrebbe cambiare nulla a livello pratico... adesso te la salva l'ora nel campo logged o no?
keiske
-
si..ora la data viene correttamente salvata:)
ho modificato l ordine..[PHP]
<?
session_start(); //avvio l'utilizzo delle sessionisession_start(); //avvio l'utilizzo delle sessioni
if($_POST['nickname'])
$nickname = mysql_real_escape_string($_POST['nickname']);
else
$nickname = "";$link = mysql_connect("$db_host", "$db_database", "$db_username", "$db_password") or die("Errore connessione: ". mysql_error());
mysql_select_db('my_italiawebchat') or die("Errore apertura database: " . mysql_error());
$selezione="SELECT nickname,password,logged,sesso FROM iscritti WHERE nickname='$nickname' AND password='". $_POST['password']."'";
$eseguisel=mysql_query($selezione);
if (mysql_num_rows($eseguisel) ==1) {
echo "Login effetuato con successo..Attendi";//inserisco nel campo logged l orario del login
$query = "
UPDATE iscritti SET
logged = NOW()
WHERE nickname = '$nickname'
";
//ciclo while che mi richiama l'array dei dati selezionati dal databasewhile($ROW = mysql_fetch_array($eseguisel))
{
//qui vanno settati un po' di SESSIONI
$_SESSION['logged']=1;//setto che l'utente è loggato
$_SESSION['nickname']=$ROW[nome];//inserisco una nuova chiave di sessione con il nome utente
$_SESSION['sesso']=$ROW[sesso];//inserisco una nuova chiave di sessione con il sesso dell'utente
}//eseguo la query che inserisce i dati nel campo logged
$eseguiquery=mysql_query($query);
//ora proseguo con l'header
header("Location: pannellodicontrollo.php");
exit;
} else {
echo "Dati non presenti nei nostri database..Attendi";
//annullo tutte le chiavi di sessioni se esistono
session_unset();
session_destroy();
header("Location: iscrizionesito.htm");
exit;
}
?>
[/PHP]
-
Adesso nell'altro file la query
$query = "SELECT nickname,logged FROM iscritti WHERE logged <> '' AND logged < NOW()-3600 ''";
$result = mysql_query($query)correggila in
$query = "SELECT nickname,logged FROM iscritti WHERE logged <> ''";
$result = mysql_query($query)Intanto vediamo se ti mostra tutti quelli che hanno un valore nel campo logged, qualunque esso sia... se lo fa poi bisognerà impostare l'AND per calcolare che il valore non sia più vecchio di un'ora... per farlo il modo migliore è trasformare l'ora del timestamp della tabella in secondi e confrontarlo con il valore time()-60*60 e chiedere che quello nella tabella sia maggiore...
keiske