[Gfoss] Refresh pagina (Ajax e PHP) ad ogni inserimento nuovo record di PostGIS

G. Allegri giohappy a gmail.com
Gio 9 Giu 2011 13:12:30 CEST


Bene Nicola, mi fa piacere che tu abbia risolto ;)

Il giorno 09 giugno 2011 12:56, Nicola De Innocentis <
deinnocentis.nicola a gmail.com> ha scritto:

> RISOLTO!
>
> C'era solo un problema di temporizzazione della funzione Data().
> Bisognava sostituire setTimeout("Data()",10000)  in
> setInterval(Data()",10000) in modo che la funzione venisse richiamata
> periodicamente ogni 10 sec.
>
> Allora per il bene della comunità vi riepilogo il mio script , per chi ne
> volesse fare uso e migliorarlo.
>
> ----------PHP--------------
>
>
>
> <?php
> $connessione=pg_connect("host=host port=5432 dbname=dbname user=postgres
> password=psw");
> $result=pg_query("SELECT data FROM tabella ORDER BY gid DESC LIMIT 1");
> $data_in = pg_fetch_array($result);
> $data_insert=strtotime($data_in[0]);
> $adesso=strtotime("now");
> if ($adesso-10<$data_insert){
>     echo '1';
>     }else echo '0';
> ?>
> --------------index.php-------------------
>
>
> function myHandler() {
>
>     if (myRequest.readyState == 4 && myRequest.status == 200) {
>        if(myRequest.responseText=='1'){
>             window.location.href = 'index.php';
>             //alert(myRequest.responseText);
>
>           }
>     }
> }
>
>     function Data(){
>
>         myRequest = new OpenLayers.Request.XMLHttpRequest();
>         myRequest.open("GET","now.php");
>         myRequest.setRequestHeader('Content-Type','text/xml');
>         myRequest.onreadystatechange = myHandler;
>         myRequest.send(null);
> }
>
>  <script type="text/javascript">
> setInterval("Data()",10000);
> </script>
>
> Grazie a tutti per i preziosi consigli!!!
>
>
> Il giorno 09 giugno 2011 11:30, Nicola De Innocentis <
> deinnocentis.nicola a gmail.com> ha scritto:
>
> Ciao,
>> ho seguito alla fine il consiglio di Giovanni,dopo aver provato quello del
>> Count di Stefano,ma senza sostanziali differenze,e alla fine ho prodotto
>> questo piccolo script di controllo in php.
>>
>>
>> <?php
>>
>> $connessione=pg_connect("host=host port=5432 dbname=dbname user=postgres
>> password=psw");
>> $result=pg_query("SELECT data FROM tabella ORDER BY gid DESC LIMIT 1");
>> $data_in = pg_fetch_array($result);
>> $data_insert=strtotime($data_in[0]);
>> $adesso=strtotime("now");
>> if ($adesso-10<$data_insert){
>>     echo '1';
>>     }else echo '0';
>>
>> ?>
>>
>> In pratica ho creato semplicemente una colonna data,che mi rappresentava
>> la data di inserimento del record. Questa viene poi confrontata con la data
>> di "adesso" (che dovrebbe essere quella della richiesta ,quando il php viene
>> richiamato) meno lo step .
>> Se da lato server vado ad inserire il record,il file php mi funziona
>> perfettamente,controllando da browser infatti,visualizzo per 10sec il valore
>> 1,dopo di che questo ritorna a 0 quando la condizione dell'if non è più
>> verificata.
>> Il problema è adesso nel mio file index.php che deve essere aggiornato
>> attraverso lo script ajax.La pagina,infatti,non si riaggiorna , oppure
>> lancia la richiesta,ma vede sempre il valore 0 e quindi il mancato
>> riaggiornamento.Questo è lo script ajax di refresh:
>>
>>     /* Funzione che verifica il responso della procedura di controllo
>>     se restituisce 1 allora effettua il refresh */
>>
>> function myHandler() {
>>
>>
>>     if (myRequest.readyState == 4 && myRequest.status == 200) {
>>         if(myRequest.responseText=='1'){
>>
>>             window.location.href = index.php';
>>
>>           }
>>     }
>> }
>>
>>     function Data(){
>>
>>         myRequest = new OpenLayers.Request.XMLHttpRequest();
>>         myRequest.open("GET","now.php");
>>
>>         myRequest.setRequestHeader('Content-Type','text/xml');
>>         myRequest.onreadystatechange = myHandler;
>>         myRequest.send(null);
>> }
>> <body>
>>
>>  <script type="text/javascript">
>> setTimeout("Data()",10000);
>> </script>
>> </body>
>>
>> C'è sicuramente qualcosa che sbaglio ma non capisco dove.Grazie sempre per
>> la disponibilità.
>> Saluti.Nicola.
>>
>> Il giorno 07 giugno 2011 13:12, G. Allegri <giohappy a gmail.com> ha
>> scritto:
>>
>> Facciamo un passo indietro. Ripensando a quello che devi fare, l'uso di
>>> variabili di sessione lato server ovviamente non funziona, perché le
>>> richieste d'inserimento e di aggiornamento arrivano da client diversi. Un
>>> contatore lato client potrebbe andar bene, manetendolo come variabile
>>> d'istanza (o globale), e confrontando questo contatore con quello di ritorno
>>> dalla richiesta. Dopo il confronto devi aggiornare il contatore. Non è certo
>>> la soluzione ideale, ma funziona.
>>> Altrimenti, come diceva Stefano, inserisci una colonna (o ti fai un'altra
>>> tabella esterna se non vuoi cambiare la struttura della tabella originale)
>>> in cui inserire la data d'inserimento. Ad ogni richiesta del client
>>> confronti il Time della richiesta (togliendo lo step temporale tra le
>>> richieste, es. 10s) e lo confronti con quello dell'inserimento.
>>>
>>> Es. Inserimento 0.00.00:01 (mezzanotte e un secondo)
>>> Richiesta client: 0.00.00:12
>>>
>>> effective_time = 0.00.00:12 - 10s -> 0.00.00:02
>>>
>>> Siccome effective_time è maggiore della data d'inserimento, vuol dire che
>>> dalla precedente richiesta non è stato aggiunto niente...
>>> Se invece l'inserimento fosse stato effettuato alle 0.00.00:03, allora
>>> l'inserimento è avvenuto tra la precedente richiesta e quella attuale.
>>>
>>> Ci possono essere tanti modi per gestire questa cosa. Questi due forse
>>> sono i più semplici e immediati...
>>>
>>> Giovanni
>>>
>>> Il giorno 07 giugno 2011 12:51, Nicola De Innocentis <
>>> deinnocentis.nicola a gmail.com> ha scritto:
>>>
>>> Ciao, allora ho fatto un po' di prove e sono arrivato a tale
>>>> risultato.Purtroppo però non mi fa l'aggiornamento.
>>>> Seguendo il II suggerimento,ho creato un contatore che viene aggiornato
>>>> ad ogni richiesta.Lasciando intatta la funzione Data() dove invio la
>>>> richiesta,ho modificato,invece,la funzione myHandler(),all'interno della
>>>> quale ho inizializzato un contatore.Attraverso questi si verifica con degli
>>>> if se myRequest.responseText è diverso o meno dalla variabile contatore,e
>>>> quindi si effetua o meno il refresh della pagina.
>>>> Ho modificato pure controllo.php che mi verifica il COUNT,passando come
>>>> parametro finale $array['conto'] ovvero il numero di record e non più
>>>> $esito(valore 0 o 1).
>>>>
>>>>
>>>> function myHandler() {
>>>>     var contatore=null;
>>>>
>>>>     if (myRequest.readyState == 4 && myRequest.status == 200) {
>>>>        if(myRequest.responseText>contatore){
>>>>
>>>>             window.location.href = 'index.php';
>>>>             contatore=myRequest.responseText;
>>>>             return contatore;
>>>>           } if (myRequest.responseText==contatore){
>>>>             return contatore;
>>>>             }if(myRequest.responseText<contatore){
>>>>
>>>>             window.location.href = 'index.php';
>>>>              contatore=myRequest.responseText;
>>>>             return contatore;
>>>>           }
>>>>     }
>>>> }
>>>>
>>>> ----------------PHP--------------------controllo.php-------------------
>>>> <?php
>>>> // effettuo alcuni controlli come ad esempio una query
>>>> // una modifica a variabili di sessione o altro - dipende da voi
>>>> // nel mio esempio controllo il numero di record in una tabella...
>>>>
>>>>
>>>> $connessione=pg_connect("host=*host* port=5432 dbname=*dbname* user=*
>>>> postgres* password=*psw*");
>>>>
>>>>
>>>> $query = "SELECT COUNT(*) AS conto  FROM tabella";
>>>> $result = pg_query($query) or die (pg_error());
>>>>
>>>> $array = pg_fetch_array($result);
>>>>
>>>> $contatore=(int)$array['conto'];        //qui converto in intero
>>>> echo $contatore;
>>>> ?>
>>>>
>>>> Ora all'aggiunta o eliminazione di un record lato server,lo script lato
>>>> client non funziona e non mi aggiorna la pagina.Sicuramente c'è qualcosa di
>>>> errato,data la mia inesperienza.Qualche suggerimento?
>>>> Grazie sempre per gli aiuti....
>>>> Nicola.
>>>> Il giorno 06 giugno 2011 21:32, Nicola De Innocentis <
>>>> deinnocentis.nicola a gmail.com> ha scritto:
>>>>
>>>> Grazie per i consigli preziosi,proverò subito i vostri suggerimenti.
>>>>> nicola.
>>>>>
>>>>> Il giorno 06 giugno 2011 20:02, G. Allegri <giohappy a gmail.com> ha
>>>>> scritto:
>>>>>
>>>>> O se non vuoi inerire una nuova colonna ti tieni un contatore in
>>>>>> sessione che aggiorni ad ogni richiesta. Se in una richiesta il COUNT è
>>>>>> diverso dal contatore, qualcosa è stato aggiunto (o tolto).
>>>>>>
>>>>>> giovanni
>>>>>>
>>>>>> Il giorno 06 giugno 2011 19:06, Stefano Salvador <
>>>>>> stefano.salvador a gmail.com> ha scritto:
>>>>>>
>>>>>> l'errore secondo me è nella query che usi per leggere i dati:
>>>>>>>
>>>>>>> > $query = "SELECT COUNT(*) AS conto  FROM tabella";
>>>>>>>
>>>>>>> con questa query conti tutti i record della nella tabella, se vuoi
>>>>>>> solo i record nuovi devi usare una qualche tipo di condizione di
>>>>>>> where, ad esempio supponendo che nella tabella ci sia una colonna con
>>>>>>> il tempo in cui è stato inserito il record dovresti fare qualcosa del
>>>>>>> tipo:
>>>>>>>
>>>>>>> > $query = "SELECT COUNT(*) AS conto  FROM tabella WHERE
>>>>>>> tempo_inserimento >".$ultimo_aggiornamento;
>>>>>>>
>>>>>>> dove $ultimo_aggiornamento è una variabile che devi salvarti nella
>>>>>>> sessione oppure passare come parametro della richiesta http.
>>>>>>>
>>>>>>>
>>>>>>> Ciao,
>>>>>>>
>>>>>>> Stefano
>>>>>>> _______________________________________________
>>>>>>> Iscriviti all'associazione GFOSS.it:
>>>>>>> http://www.gfoss.it/drupal/iscrizione
>>>>>>> Gfoss a lists.gfoss.it
>>>>>>> http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
>>>>>>> Questa e' una lista di discussione pubblica aperta a tutti.
>>>>>>> Non inviate messaggi commerciali.
>>>>>>> I messaggi di questa lista non rispecchiano necessariamente
>>>>>>> le posizioni dell'Associazione GFOSS.it.
>>>>>>> 518 iscritti al 3.6.2011
>>>>>>>
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> Iscriviti all'associazione GFOSS.it:
>>>>>> http://www.gfoss.it/drupal/iscrizione
>>>>>> Gfoss a lists.gfoss.it
>>>>>> http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
>>>>>> Questa e' una lista di discussione pubblica aperta a tutti.
>>>>>> Non inviate messaggi commerciali.
>>>>>> I messaggi di questa lista non rispecchiano necessariamente
>>>>>> le posizioni dell'Associazione GFOSS.it.
>>>>>> 518 iscritti al 3.6.2011
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Nicola De Innocentis
>>>>>
>>>>> www.nicoladeinnocentis.it
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> Nicola De Innocentis
>>>>
>>>> www.nicoladeinnocentis.it
>>>>
>>>>
>>>
>>
>>
>> --
>> Nicola De Innocentis
>>
>> www.nicoladeinnocentis.it
>>
>>
>
>
> --
> Nicola De Innocentis
>
> www.nicoladeinnocentis.it
>
>
> _______________________________________________
> Iscriviti all'associazione GFOSS.it: http://www.gfoss.it/drupal/iscrizione
> Gfoss a lists.gfoss.it
> http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
> Questa e' una lista di discussione pubblica aperta a tutti.
> Non inviate messaggi commerciali.
> I messaggi di questa lista non rispecchiano necessariamente
> le posizioni dell'Associazione GFOSS.it.
> 518 iscritti al 3.6.2011
>
-------------- parte successiva --------------
Un allegato HTML ? stato rimosso...
URL: <http://lists.gfoss.it/pipermail/gfoss/attachments/20110609/27427d3e/attachment-0001.html>


Maggiori informazioni sulla lista Gfoss