• User Attivo

    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 if

    Come 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...


  • User Attivo

    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


  • User Attivo

    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...


  • User Attivo

    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?


  • User Attivo

    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


  • User Attivo

    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


  • User Attivo

    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 😄


  • User Attivo

    @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


  • User Attivo

    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


  • User Attivo

    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 intero

    login.php
    [PHP]
    <?
    session_start(); //avvio l'utilizzo delle sessioni

    session_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?


  • User Attivo

    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...


  • User Attivo

    🙂
    ok...fatta la query..

    [PHP]
    <?
    session_start(); //avvio l'utilizzo delle sessioni

    session_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 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]


  • User Attivo

    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


  • User Attivo

    si..ora la data viene correttamente salvata:)
    ho modificato l ordine..

    [PHP]
    <?
    session_start(); //avvio l'utilizzo delle sessioni

    session_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
    }

    //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]


  • User Attivo

    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


  • User Attivo

    allora la pagina ..

    [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 <> ''";
    $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"Utenti online $nickname";
    ?>
    <li><?=$nickname?></li>
    <?php } ?>
    </ul>
    </div>
    <?php } ?>
    [/PHP]
    e mi stampa a video ciò

    Utenti online paolo
    paolo
    Utenti online vito
    vito
    Utenti online gino
    gino
    Utenti online marta
    marta

    questi sono utenti creati da me...e con paolo per esempio nn ho ami fatto login e pure lo da nella lista...


  • User Attivo

    te li scrive due volte per ognuno? paolo nel database ha come valore "logged" il vuoto? può darsi che tu debba mettere <> da '00:00:00 00-00-00' (oddio controlla il formato), ma ad ogni modo se poi implementi il controllo chi non ha un valore di login avrà sicuramente come risultato un timestamp < al time()-60*60 e quindi non servirà il primo WHERE... adesso era solo per vedere se funzionava... d'altro canto se ci devi perdere tempo lascia stare e lavora subito su una funzioncina che ti permetta di controllare i due valori... (anche perchè a pensarci bene invece di usare il timestamp nel "logged" si potrebbe fare come nei forum che memorizzano il numero di secondi dal 1970 (lo standard per il time()) e infatti trovi cose tipo:

    send_time: 1523450043

    Sicuramente così sarebbe più semplice confrontare quel valore con time()-60*60 che sarebbe già in quel formato...

    Ok, per il doppio nick semplicemente devi togliere:

    echo"$nickname";

    che avevi settato per vedere se passava alla query... passa, quindi puoi toglierlo 😄

    keiske


  • User Attivo

    si paoloe gino hanno come valore 0000 nel database


  • User Attivo

    spingerei per questa soluzione...

    modifica il campo "logged" da "date" a "int double" così memorizzi numeri...

    prima della query in cui inserisci l'ora fai:

    $ora_log = time();

    alla query invece di passare NOW() passi '$ora_log' (mi raccomando gli apici che con NOW() non servono mentre con $ora_log servono)

    Fatto questo nel database dovresti trovarti un valore per chi si logga simile a 1532546070, insomma una bella cifrona (sono i secondi passati dal 1970 ad oggi)

    A questo punto nel file utentionline.php prima della query fai

    $ora_scadenza = time()-60*60;

    E nella query metti WHERE 'logged' < '$ora_scadenza'

    In questo modo confronti l'ora di log che se è antecedente all'ora attuale meno un'ora vuol dire che per te è troppo vecchia e non va visualizzato... se uno ancora non si è loggato il valore di logged è 0 quindi di sicuro è < a '$ora_scadenza' e così te la cavi con un solo WHERE

    Prova così...

    keiske


  • User Attivo

    Scusami...e un errore mio...
    cioè
    quei 0000 0000 erano vecchi...cioè me li aveva scritti quando ancora nn funzionava bene lo script che doveva stamparmi l ora del login

    quindi mi ebastato fare un login con i 2 utenti che avevano valore 0000 per far si che scomparisse lo 0000 e comparisse l ora ela data del login...

    ora credo funzioni tutto..
    cioè facendo un esempio se entro un ora nn effettuo il login con l utente paolo..quest ultimo nn dovrebbe piu' apparire nella lista utenti online..:)

    c'è un particolare però..l utente marta ho notato che nel database mi da
    2008-07-10 15:03:43

    quindi nn dovrebbe risultare online..invece risulta