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

Ciao a tutti,
volevo esporvi una piccola problematica per un refresh di una mappa ad un evento lato server.
Questa cosa l’ho risolta in parte con Ajax e l’oggetto OpenLayers.Request.XMLHttpRequest().
Vorrei semplicemente sapere se, ad ogni volta che si lancia la richiesta ogni tot secondi,si possa controllare o verificare che nella tabella del database ci
sia stata una modifica(nuovi record inseriti,in pratica nuovi punti sulla mappa) oppure no(quindi niente refresh).A tale proposito ho visto un esempio di file controllo.php, ma non credo che funzioni perfettamente in quanto le condizioni all’interno mi fanno aggiornare sempre la pagina.
Mi potreste aiutare a capire con quale logica posso interrogare il database per capire se c’è stata o meno una modifica.Vi posto brevemente la parte ajax e il php che controlla il db.

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();//CreateXmlHttpReq2();
myRequest.open(“GET”,“controllo.php”);
myRequest.setRequestHeader(‘Content-Type’,‘text/xml’);
myRequest.onreadystatechange = myHandler;
myRequest.send(null);
}

—PHP----controllo.php

<?php // la variabile che utilizzeremo per verificare l'esito del controllo // 0 se non è necessario il refresh // 1 se è da effettuare il refresh $esito = 0; $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); if($array['conto']>1){ echo $esito=1; }else{ echo $esito=0; } ?>

Grazie per l’aiuto :slight_smile: …saluti.

Nicola De Innocentis

www.nicoladeinnocentis.it

Scusami Nicola, non ho capito questa frase:

sia stata una modifica(nuovi record inseriti,in pratica nuovi punti sulla mappa) oppure no(quindi niente refresh).A tale proposito ho visto un esempio di file controllo.php, ma non credo che funzioni perfettamente in quanto le condizioni all’interno mi fanno aggiornare sempre la pagina.

<<le condizioni all’interno mi fanno aggiornare sempre la pagina>>?

Giovanni

Mi potreste aiutare a capire con quale logica posso interrogare il database per capire se c’è stata o meno una modifica.Vi posto brevemente la parte ajax e il php che controlla il db.

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();//CreateXmlHttpReq2();
myRequest.open(“GET”,“controllo.php”);
myRequest.setRequestHeader(‘Content-Type’,‘text/xml’);
myRequest.onreadystatechange = myHandler;
myRequest.send(null);
}

—PHP----controllo.php

<?php // la variabile che utilizzeremo per verificare l'esito del controllo // 0 se non è necessario il refresh // 1 se è da effettuare il refresh $esito = 0; $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); if($array['conto']>1){ echo $esito=1; }else{ echo $esito=0; } ?>

Grazie per l’aiuto :slight_smile: …saluti.

Nicola De Innocentis

www.nicoladeinnocentis.it


Iscriviti all’associazione GFOSS.it: http://www.gfoss.it/drupal/iscrizione
Gfoss@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

Si scusami, forse il mio pensiero è stato poco felice.
In realtà quello che voglio fare è che ad ogni inserimento di un nuovo record nella tabella postgis,ci sia un refresh della pagina (aggiornamento lato client).
La condizione a cui mi riferivo è presente nel file di controllo.php ed è la seguente:

if($array[‘conto’]>1){
echo $esito=1;
}else{
echo $esito=0;
}

Mi da sempre $esito=1 in quanto la condizione $array[‘conto’]>1 è sempre verificata.Questo ovviamente mi fa riaggiornare sempre la pagina ogni 10sec.In pratica non vede mai se c’è o meno un nuovo evento lato server.
Dovrei cambiare condizione o addirittura algoritmo per fare questo tipo di verifica.
Spero di essere stato un po’ più chiaro.

Il giorno 06 giugno 2011 18:32, G. Allegri <giohappy@gmail.com> ha scritto:

Scusami Nicola, non ho capito questa frase:

sia stata una modifica(nuovi record inseriti,in pratica nuovi punti sulla mappa) oppure no(quindi niente refresh).A tale proposito ho visto un esempio di file controllo.php, ma non credo che funzioni perfettamente in quanto le condizioni all’interno mi fanno aggiornare sempre la pagina.

<<le condizioni all’interno mi fanno aggiornare sempre la pagina>>?

Giovanni

Mi potreste aiutare a capire con quale logica posso interrogare il database per capire se c’è stata o meno una modifica.Vi posto brevemente la parte ajax e il php che controlla il db.

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();//CreateXmlHttpReq2();
myRequest.open(“GET”,“controllo.php”);
myRequest.setRequestHeader(‘Content-Type’,‘text/xml’);
myRequest.onreadystatechange = myHandler;
myRequest.send(null);
}

—PHP----controllo.php

<?php // la variabile che utilizzeremo per verificare l'esito del controllo // 0 se non è necessario il refresh // 1 se è da effettuare il refresh $esito = 0; $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); if($array['conto']>1){ echo $esito=1; }else{ echo $esito=0; } ?>

Grazie per l’aiuto :slight_smile: …saluti.

Nicola De Innocentis

www.nicoladeinnocentis.it


Iscriviti all’associazione GFOSS.it: http://www.gfoss.it/drupal/iscrizione
Gfoss@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

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

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

Grazie per i consigli preziosi,proverò subito i vostri suggerimenti.
nicola.

Il giorno 06 giugno 2011 20:02, G. Allegri <giohappy@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@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@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@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

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

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

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);
}

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

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);
}

Grazie a tutti per i preziosi consigli!!!

Il giorno 09 giugno 2011 11:30, Nicola De Innocentis <deinnocentis.nicola@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);
}

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

Bene Nicola, mi fa piacere che tu abbia risolto :wink:

Il giorno 09 giugno 2011 12:56, Nicola De Innocentis <deinnocentis.nicola@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);
}

Grazie a tutti per i preziosi consigli!!!

Il giorno 09 giugno 2011 11:30, Nicola De Innocentis <deinnocentis.nicola@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);
}

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