• User Attivo

    Avvisare in caso di arrivo nuovo messaggio

    Salve a voi...
    ho creato uno script per l invio dei messaggi fra utenti iscritti al sito...ora ho pensato di fare in modo che quando l utente riceva un nuovo messaggio debba uscire un alert che avvisi"Nuovo messaggio ricevuto!"

    Allora..pensavo che la cosa andasse fatta tutta col javascript...ma forse no....col php qualcosa si potrebbe fare...

    Posto il codice...
    [php]
    /recupero i valori dal form precedente
    $cdestinatario = $_POST['destinatario'];
    $cmessaggio = $_POST['messaggio'];
    $cmittente = $_SESSION['nickname'];

    //mi connetto al database
    $link = mysql_connect("$db_host", "$db_database", "$db_username", "$db_password") or die("Errore connessione: ". mysql_error());
    //seleziono la tabella
    mysql_select_db('my_italiawebchat') or die("Errore apertura database: " . mysql_error());

    $strsql="INSERT INTO messaggi (nome_inviante,nome_ricevente,messaggio,date) VALUES ('$cmittente','$cdestinatario','$cmessaggio',NOW())";

    [/php]In questa pagina mi recupero il nome di chi invia il messaggio,il destinatario,e il corpo del messaggio...e in piu' mi stampo l ora dell invio...
    Avevo pensato di aggiungere di un altro campo "messaggidaleggere" che dovrebbe risultare 0 quando e vuoto e 1 quando c'è qualche messaggio all interno..e quindi se 1 lanciare l alert "Hai ricevuto un nuovo messaggio!"

    Ora mi chiedo...come faccio per permettere a php di controllare in continuazione che quel campo sia 0 o 1?Basta un if?
    Un altra domanda....come faccio poi per far ritornare a 0 il campo "messaggidaleggere" dopo che ho letto o ricevuto il messaggio?

    Grazie


  • Consiglio Direttivo

    Ciao carlitos1982. 🙂

    @carlitos1982 said:

    Ora mi chiedo...come faccio per permettere a php di controllare in continuazione che quel campo sia 0 o 1? Basta un if?
    Se per "in continuazione" intendi ad ogni caricamento di pagina...allora puoi gestire tutto in PHP. Ma se vuoi che l'alert appaia subito (più o meno) anche se l'utente non refresha o cambia pagina del sito allora ti dovrai indirizzare sul Js (tranne se lavori con i frame....ma è cosa altamente sconsigliata indi passo oltre :)).
    In PHP ti basterà eseguire una select ad ogni inizio di pagina per verificare l'esistenza di messaggi da leggere per l'utente:
    [php]$sql="SELECT letto FROM messaggi WHERE nome_ricevente='".$_SESSION['nickname']."' AND letto=1";[/php]Se la SELECT non è vuota, allora dai l'alert. 😉

    @carlitos1982 said:

    Un altra domanda....come faccio poi per far ritornare a 0 il campo "messaggidaleggere" dopo che ho letto o ricevuto il messaggio?
    Immagino che l'utente visualizzerà la posta in arrivo e quindi selezionerà il messaggio nuovo, all'atto della visualizzazione ti basterà fare un UPDATE per cambiare il valore del campo da 1 a 0. 😉


  • User Attivo

    Ciao:)
    La visualizzazione dell'alert e il successivo update per cambiare il valore da 1 a 0 al momento della visualizzazione del messaggio non posso farlo su unica pagina giusto..?


  • Consiglio Direttivo

    A te interessa che il messaggio risulti letto quando lo leggi effettivamente o solo dopo aver ricevuto l'alert del messaggio nuovo, anche se non lo hai mai letto? :mmm:


  • User Attivo

    La tua prima ipotesi....cioè risultare letto solo quando lo si è letto:)quindi in seguito dopo la lettura effettuare l UPDATE da 0 a 1.


  • Consiglio Direttivo

    Beh e allora no, non posson stare nella stessa pagina.
    Lo script che richiama l'alert deve essere presente in ogni pagina navigabile del sito, invece solo nella pagina di visualizzazione del messaggio stesso deve essere presente lo script che aggiorna il valore del campo relativo a quell'id messaggio. 😉


  • User Attivo

    Fatto....funziona alla grande:)
    Grazie dei consigli;)
    [PHP]

    $cancella="UPDATE messaggi SET letto = '0' WHERE nome_ricevente='".$_SESSION['nickname']."'";
    $esegui=@mysql_query("$cancella",$link) or die("Errore query database: " . mysql_error());

    [/PHP]
    Questa è la query che mi sono inserito sulla pagina che visualizza i messaggi e siccome i messaggi degli altri utenti devono esser poter letti anche dagli altri utenti iscritti ho creato 2 pagine uguali leggimessaggi.php però su una ho inserito la query pe rcancellare il valore 0 mentre sull altra no altrimenti avrei compremesso un pò la funzionalità dello script...

    [PHP]
    //Controllo se ci sono nuovi messagi
    $sql1="SELECT letto FROM messaggi WHERE nome_ricevente='".$_SESSION['nickname']."' AND letto=1";
    $query1=@mysql_query("$sql1",$link) or die("Errore query database: " . mysql_error());

    //faccio un ciclo while

    while ($riga1 = mysql_fetch_array($query1)) {
    $str_letto = $riga1['letto'];
    if($str_letto == '1')

    echo "<SCRIPT LANGUAGE="javascript">window.alert("Hai ricevuto 1 nuovo messaggio!Controlla subito i tuoi messaggi!!!"); </script>";}

    [/PHP]
    Questa invece e la parte relativa all alert che ho inserito nell index del sito

    Grazie


  • Consiglio Direttivo

    Magnifico. 🙂

    Avrei pero' due consigli da darti sulla gestione, perché in questo modo potresti incappare in alcuni problemi:
    [php]$cancella="UPDATE messaggi SET letto = '0' WHERE nome_ricevente='".$_SESSION['nickname']."'"; [/php]Facendo in questo modo se l'utente dovesse avere più messaggi non letti nella casella di posta aggiorneresti tutti i messaggi con quel nick come destinatario, invece che solo quello che ha letto.
    Io inserirei una chiave primaria (id) auto-increment e lavorerei su questa:
    [php]$cancella="UPDATE messaggi SET letto = '0' WHERE id='$id_messaggio'";[/php]Altro problema relativo allo script dell'alert: e se i messaggi sono due o più? 🙂
    Prova ad utilizzare semplicemente il mysql_num_rows():
    [php]//Controllo se ci sono nuovi messagi
    $sql1="SELECT letto FROM messaggi WHERE nome_ricevente='".$_SESSION['nickname']."' AND letto=1";
    $query1=@mysql_query("$sql1",$link) or die ("Errore query database: " . mysql_error());

    $row=mysql_num_rows($query1);
    if($row != 0)
    {
    echo "<SCRIPT LANGUAGE="javascript">window.alert("Hai ricevuto 1 nuovo messaggio!Controlla subito i tuoi messaggi!!!"); </script>";
    }[/php]Poi potresti implementare tanti altri piccoli accorgimenti, il primo che mi viene in mente:
    in questo caso, all'arrivo del messaggio, appena l'utente refresha o cambia pagina gli arriva l'alert. E se non volesse leggere subito i messaggi? Si dovrebbe sorbire ad ogni cambio pagina l'alert?
    Questa ovviamente è una scelta gestionale che solo tu puoi prendere. 😉
    Nel caso, ad alert inviato, potresti creare un nuovo elemento di sessione per identificare l'utente che ha già ricevuto l'alert, quindi non fare più il controllo ad ogni cambio pagina:
    [php]if ($_SESSION['msg'] == 0)
    {
    //Controllo se ci sono nuovi messagi
    $sql1="SELECT letto FROM messaggi WHERE nome_ricevente='".$_SESSION['nickname']."' AND letto=1";
    $query1=@mysql_query("$sql1",$link) or die ("Errore query database: " . mysql_error());

    $row=mysql_num_rows($query1);
    if($row != 0)
    {
    echo "<SCRIPT LANGUAGE="javascript">window.alert("Hai ricevuto 1 nuovo messaggio!Controlla subito i tuoi messaggi!!!"); </script>";
    $_SESSION['msg']=1;
    }
    }[/php]In questo caso, all'atto di definire gli elementi di sessione, come il nickname, imposterai $_SESSION['msg'] = 0.

    Spero di esserti stato d'aiuto. 😉
    :ciauz:


  • User Attivo

    @Samyorn said:

    Magnifico. 🙂

    Avrei pero' due consigli da darti sulla gestione, perché in questo modo potresti incappare in alcuni problemi:
    [php]$cancella="UPDATE messaggi SET letto = '0' WHERE nome_ricevente='".$_SESSION['nickname']."'"; [/php]Facendo in questo modo se l'utente dovesse avere più messaggi non letti nella casella di posta aggiorneresti tutti i messaggi con quel nick come destinatario, invece che solo quello che ha letto.
    Io inserirei una chiave primaria (id) auto-increment e lavorerei su questa:
    [php]$cancella="UPDATE messaggi SET letto = '0' WHERE id='$id_messaggio'";[/php]Ok...ho inserito un campo id auto increment nel database...
    Sarà l orario che mi offusca...comunque come faccio a recuperarmi l id relativo al messaggio che serve a me?


  • Consiglio Direttivo

    Te la estrapoli dalla SELECT, magari la posta in arrivo immagino mostrerà i pvt ordinati per data, il link per leggere il messaggio potrebbe contenere l'id del messaggio stesso che ti permetterà la visualizzazione dello stesso e quindi l'aggiornamento del Database:
    [PHP]$sql="SELECT * FROM messaggi WHERE nome_ricevente='".$_SESSION['nickname']."' ORDER BY data";
    $query=@mysql_query($sql) or die (mysql_error());

    while ($array=mysql_fetch_array($query))
    {
    echo "<a href="visulizzamessaggio.php?id=".$array['id']."">Messaggio da :".$array['mittente']."</a> Ricevuto il ." $array['data']."<br />";
    }[/PHP]
    Così otterrai la lista ordinata dei pvt. Nella pagina di visualizzazione del messaggio ti recuperi tramite $_GET['id] l'id del messaggio e tramite questa variabile provvedi prima a selezionare il messaggio da leggere e poi ad aggiornare il campo letto. 😉


  • User Attivo

    Ok..provo:)


  • User Attivo

    @Samyorn said:

    Te la estrapoli dalla SELECT, magari la posta in arrivo immagino mostrerà i pvt ordinati per data, il link per leggere il messaggio potrebbe contenere l'id del messaggio stesso che ti permetterà la visualizzazione dello stesso e quindi l'aggiornamento del Database:
    [php]$sql="SELECT * FROM messaggi WHERE nome_ricevente='".$_SESSION['nickname']."' ORDER BY data";
    $query=@mysql_query($sql) or die (mysql_error());

    while ($array=mysql_fetch_array($query))
    {
    echo "<a href="visulizzamessaggio.php?id=".$array['id']."">Messaggio da :".$array['mittente']."</a> Ricevuto il ." $array['data']."<br />";
    }[/php]Così otterrai la lista ordinata dei pvt. Nella pagina di visualizzazione del messaggio ti recuperi tramite $_GET['id] l'id del messaggio e tramite questa variabile provvedi prima a selezionare il messaggio da leggere e poi ad aggiornare il campo letto. 😉

    Ok,ho suddiviso il tutto quindi in due pagine....la prima
    postainarrivo.php
    [php]
    <html>
    <head>
    <body>
    <?
    //Apro la sessione e...
    session_start();
    //verifico che dopo il login io abbia la chiave di sessione ad 1
    if($_SESSION['logged']==1){
    //se si...

    //mi connetto al datase
    $link = mysql_connect("$db_host", "$db_database", "$db_username", "$db_password") or die("Errore connessione: ". mysql_error());
    //seleziono il database
    mysql_select_db('my_italiawebchat') or die("Errore apertura database: " . mysql_error());

    $sql="SELECT id,nome_inviante,nome_ricevente,messaggio,date FROM messaggi WHERE nome_ricevente='".$_SESSION['nickname']."' ORDER BY date";
    $query=@mysql_query($sql) or die (mysql_error());

    while ($array=mysql_fetch_array($query))
    {
    echo "<a href="letturaposta.php?id=".$array['id']."">Messaggio da :".$array['nome_inviante']."</a> Ricevuto il ".$array['date']."<br />";
    }

    }
    ?>[/php]e la seconda pagina per la lettura chiamata letturaposta.php
    [php]
    <html>
    <head>
    <body>
    <?
    //Apro la sessione e...
    session_start();
    //verifico che dopo il login io abbia la chiave di sessione ad 1
    if($_SESSION['logged']==1){
    //se si...
    //verifico se esiste la variabile id
    if(isset($_GET['id']) OR $_GET['id'] != ""){
    $id=$_GET['id'];
    }

    //mi connetto al datase
    $link = mysql_connect("$db_host", "$db_database", "$db_username", "$db_password") or die("Errore connessione: ". mysql_error());
    //seleziono il database
    mysql_select_db('my_italiawebchat') or die("Errore apertura database: " . mysql_error());

    $sql="SELECT id,nome_inviante,nome_ricevente,messaggio,date FROM messaggi WHERE id='".$id."' ORDER BY date";
    $query=@mysql_query($sql) or die (mysql_error());

    while ($array=mysql_fetch_array($query))
    {
    echo "Messaggio da :".$array['nome_inviante']."</a> Ricevuto il ".$array['date']."<br />Testo ".$array['messaggio']." ";
    }
    //Porto valore a 0 soltanto per l id del messaggio recuperato
    $cancella="UPDATE messaggi SET letto = '0' WHERE id='$id'";
    $esegui=@mysql_query("$cancella",$link) or die("Errore query database: " . mysql_error());
    }
    exit;
    ?>
    [/php]Funziona...cioè mi porta a valore 0 soltanto i messaggi che leggo:)

    Poi nella index del sito in cui c'è l alert ho fatto cosi'

    [php]
    if ($_SESSION['msg'] == 0)
    {
    //Controllo se ci sono nuovi messagi
    $sql1="SELECT letto FROM messaggi WHERE nome_ricevente='".$_SESSION['nickname']."' AND letto=1";
    $query1=@mysql_query("$sql1",$link) or die ("Errore query database: " . mysql_error());

    $row=mysql_num_rows($query1);
    if($row != 0)
    {
    echo "<SCRIPT LANGUAGE="javascript">window.alert("Hai ricevuto 1 nuovo messaggio!Controlla subito i tuoi messaggi!!!"); </script>";
    $_SESSION['msg']=1;
    }
    }

    ?>[/php]:)
    Funziona...cioè l alert mi esce solo la prima volta che accedo alla index...se refresho la pagina non esce...
    Scusami...quest ultimo passaggio...correggimi se sbaglio...spero di aver capito bene..
    Appena accedo alla index del sito la variabile $_SESSION['msg'] == 0 e uguale a 0 quindi mi da l alert...poi qui
    [php]
    echo "<SCRIPT LANGUAGE="javascript">window.alert("Hai ricevuto 1 nuovo messaggio!Controlla subito i tuoi messaggi!!!"); </script>";
    $_SESSION['msg']=1;[/php]viene passato il valore da 0 a 1 della variabile $_SESSION['msg'] e memorizzato al posto del vecchio $_SESSION['msg'] == 0...quindi ai successivi refresh $_SESSION['msg'] == 0 sarà falso e non darà l alert...ho capito bene la funzionalità si..?


  • Consiglio Direttivo

    Hai capito benissimo, scusa se son stato poco chiaro io nel spiegarlo. 😉


  • User Attivo

    Figurati!;)
    L importante è aver capito come funziona.

    Grazie


  • User Attivo

    ciao carlitos1982 non è che potresti postarmi i codici della pagina per l'invio dei messaggi e dei messaggi inviati?
    Se non vuoi non preoccuparti!
    ciao
    steave67